2016-10-28 19 views
1

私は、文字列の配列を含むフィールドを持つテーブルを持っています(タイプはcharacter varying(255)[]です)。PostgreSQL:LIKE、ANY、およびワイルドカードを使用するwhere節

このフィールドの任意の要素に、指定した文字列とワイルドカード(例:'query%')を比較したいとします。

この要求作品と予想される結果取り戻す:

SELECT * FROM my_table WHERE 'query' ILIKE ANY(my_field) 

しかし、ワイルドカードで、私は何の結果を得なかっ:

SELECT * FROM my_table WHERE 'query%' ILIKE ANY(my_field) 

私は理由がワイルドカードのみでサポートされていることだと思うがILIKEオペレータの右側にありますが、ANY(my_field)もオペレータの後になければなりません。

私が欲しいものを達成する方法はありますか?

PostgreSQL 9.5の使用。あなたは配列フィールドネスト解除する必要が

+0

[のPostgreSQL可能な複製を使用する - テキスト配列は値が含まれています類似している](http://stackoverflow.com/questions/34657669/postgresql-text-array-contains-value-similar-to) – pozs

+0

あなたはそうだ、これは重複している、私はそれを見ていない。しかし、私は@klinが詳細な答えを書いてくれてうれしく思います。これは他の投稿にはありませんでした。 – scandel

答えて

2

with my_table(my_field) as (
values 
    (array['query medium', 'large query']), 
    (array['large query', 'small query']) 
) 
select t.* 
from my_table t, 
lateral unnest(my_field) elem 
where elem ilike 'query%'; 

      my_field    
-------------------------------- 
{"query medium","large query"} 
(1 row) 
+0

ありがとう、それは完璧なソリューションです。 DISTINCT(distinct t。*を選択)を追加しなければなりませんでした。なぜなら、my_fieldに 'query%'が何回か現れたテーブルにいくつかの行があったからです。 – scandel

1

(アンネストとセットに配列に変換)し、EXIST句

SELECT * FROM my_table t WHERE EXISTS (SELECT unnest(t.my_field) AS f WHERE f ILIKE ‘query%’) 
+0

これは良い解決策です。なぜなら、すべてがwhere句にとどまり、より複雑な要求には役立つからです。しかし、あなたの要求はpostgresqlのエラーを引き起こし、私はそれを動作させるために修正しなければならなかった: 'SELECT * FROM my_table t WHERE EXISTS(SELECT f FROM unest(t.my_field)AS f WHERE f ILIKE 'query%')' – scandel

関連する問題