🦔
【postgreSQL】配列を使って、複数のLike条件をシンプルにする
はじめに
postgreSQL
で配列があるものの、いまいち使いどころが分かず。。。
こういう書き方もできるんだという発見がありましたので、まとめてみました。
配列の詳細を知りたい場合は、古い記事ですが↓を参考に
ざっくり背景
バックアップテーブルを定期的に作成しているバッチがいて、バックアップテーブルも保存期間が来たら削除したいなーという要件がありました。
ただ、保存期間も一部のテーブルは長めに設定されていて、対象テーブルの一覧はpg_tables
から取得すればいいが、like
、not like
を何個も書くのは嫌だなぁという気持ちから、書き換えてみました。
同一項目でlikeを含む複数のOR条件
select * from tableA
where columnA like 'ABC%'
or columnA like 'ABD%'
or columnA like '%AABBCC%'
or columnA = 'XYZ';
↓ のように書き換えられます
select * from tableA
where columnA like any(array['ABC%','ABD%','%AABBCC%', 'XYZ']);
any
は、いずれかが一致していればいいということなのでOR
条件と同じようになります。
columnA = 'XYZ
は、完全一致なので%
を使わないlike条件でも書き換えが可能です
同一項目でnot likeを含む複数のAND条件
select * from tableA
where columnA not like 'ABC%'
and columnA not like 'ABD%'
and columnA not like '%AABBCC%'
and columnA <> 'XYZ';
↓ のように書き換えられます
select * from tableA
where columnA not like all(array['ABC%','ABD%','%AABBCC%', 'XYZ']);
all
は、すべての条件が一致していればいいということなのでAND
条件と同じようになります。
おわりに
OR
、AND
と同じ感じにと言われても、=
や<>
の完全一致の条件しかなければin
、not in
を使えばいいとなるし、同一カラムで複数のlike
条件が含まれるという、限られた状況だとは思うが結構シンプルに書き換えられているのではないかと思う。
(正規表現でやることも考えたが、正規表現を見ると拒否反応が…)
また、インデックスとかのパフォーマンスについては、特に考慮していないです。
この条件以外のところで、レコードは絞れている想定なので。
ほかに、こんな書き換えがあるよとか、間違ってるよとかありましたら、
指摘お願いしますm(_ _"m)
Discussion