2016-11-21 10 views
0

Gibt es eine Möglichkeit, dass ich diesen OR-Ausdruck zu UND ändern kann?Postgres ähnlich zu mit UND

title SIMILAR TO '%(foo|bar)%' 

Dies gibt jetzt alle Zeilen zurück, die entweder foo oder bar im Titel enthalten. Wie würde ich Zeilen zurückgeben, die foo und bar enthalten, aber in dieser Reihenfolge nicht notwendig sind?

Also "foo bar" und "bar foo" und "foo bla bar" sind alle gültigen Ergebnisse. Aber „foo Salat“ ist nicht

Antwort

2

Verwenden Sie einfache like mit all(array[...]):

with the_data(title) as (
values 
    ('foo bar'), 
    ('bar foo'), 
    ('foo bla bar'), 
    ('foo salad') 
) 
select * 
from the_data 
where title like all(array['%foo%', '%bar%']); 

    title  
------------- 
foo bar 
bar foo 
foo bla bar 
(3 rows) 

Der Fall, dass Sie nur für ganze Wörter suchen ist ein bisschen mehr kompliziert. Sie sollten regex_split_to_array() verwenden und überprüfen, ob das resultierende Array ein Array von gesuchten Wörter enthält (mit array operator @>):

with the_data(title) as (
values 
    ('Foo bar'), 
    ('Bar foo'), 
    ('foo bla bar'), 
    ('foo salad'), 
    ('foobar'), 
    ('barfoo') 
) 
select * 
from the_data 
where regexp_split_to_array(lower(title), ' ') @> array['foo', 'bar']; 

    title  
------------- 
Foo bar 
Bar foo 
foo bla bar 
(3 rows) 
+0

Yup das funktioniert. Weißt du vielleicht, wie du den Fall ignorieren kannst? Also zum Beispiel foo und Foo und FOO ist das gleiche –

+1

@StevenSeagull 'ILIKE' ist der Fall' I'sensitive 'LIKE' – pozs

+0

@StevenSeagull Vergiss nicht [' create index idx_the_data_title auf den_Daten mit gist (title gist_trgm_ops); '] (https://www.postgresql.org/docs/current/static/pgtrgm.html), um Ihre Suche zu beschleunigen. – Abelisto

3

Sie können dies tun:

title SIMILAR TO '%(foo%bar|bar%foo)%' 
+0

Ja, aber das ist nicht elegant, da ich alle möglichen Variationen von mehreren Wörtern würde zu erzeugen. –

Verwandte Themen