ANY
を理解することも重要です ない オペレーター ただし、正しいにのみ使用できるSQL構造 オペレーターの。詳細:
- RailsのWHERE句でINの代わりにANYを使用するにはどうすればよいですか?
LIKE
演算子-またはより正確には:式 、それは~~
に書き直されます オペレーター Postgresの内部で-値を期待します 左側とパターン 右の方へ。 COMMUTATOR
はありません この演算子の場合(単純な等式演算子=
の場合と同様) )したがって、Postgresはオペランドを反転できません。
あなたの試み:
select * from someTable where '%someInput%' LIKE ANY(someColum);
左右のオペランドが反転しているため、'%someInput%'
値です および配列列の要素someColum
パターンと見なされます(これはあなたが望むものではありません)。
ANY(someColum) LIKE '%someInput%'
である必要があります -ANY
では不可能な場合を除きます 右にのみ許可される構成 オペレーターの。ここで障害が発生しています。
関連:
- 正規表現パターンを含むテキスト列に便利なインデックスを付ける方法はありますか?
- PostgreSQLは配列列にインデックスを付けることができますか?
リレーショナルデザインを正規化し、要素を保存できます。 別のテーブルの別の行の配列の。それを除けば、 unnest()
あなたがすでに自分自身を見つけたように、解決策です。ただし、少なくとも1つの一致する要素の存在にのみ関心がありますが、 EXISTS
サブクエリは、結果の重複を避けながら最も効率的です-Postgresは、最初の一致が見つかるとすぐに検索を停止できます:
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
someInput
の特殊文字をエスケープすることをお勧めします 。参照:
- 正規表現またはLIKEパターンのエスケープ関数
否定に注意してください(NOT LIKE ALL (...)
)NULL
の場合 関与することができます:
- Postgres配列にNULLが存在するかどうかを確認します