2016-11-21 2 views
0

このOR式をANDに変更する方法はありますか?とAND同様に

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

これで、タイトルにfooまたはbarのいずれかを含むすべての行が返されるようになりました。どのように私はfooとbarを含む行を返しますが、この順序では必要ではありません。

「foo bar」と「bar foo」と「foo bla bar」はすべて有効な結果です。

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

答えて

2

all(array[...])とシンプルlike使用:

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) 

あなたは全体の単語を検索している場合にのみ、もう少しですが、「FOOサラダは、」あなたはこれを行うことができます

+0

これはうまくいきます。あなたはたぶんこのことを無視する方法を知っていますか?例えば、fooとFooとFOOは同じです –

+1

@StevenSeagull 'ILIKE'は大文字と小文字が区別されます – pozs

+0

@StevenSeagull [gist(title gist_trgm_ops)を使用して_dataにインデックスidx_the_data_titleを作成することを忘れないでください] (https://www.postgresql.org/docs/current/static/pgtrgm.html)を使用して検索を高速化してください。 – Abelisto

3

ではありません複雑です。あなたはregex_split_to_array()を使用し、得られた配列は、(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

うんをしかし、私は複数の単語のすべての可能なバリエーションを生成しなければならないので、これはエレガントではありません。 –