🦔

【postgreSQL】配列を使って、複数のLike条件をシンプルにする

2024/12/25に公開

はじめに

postgreSQLで配列があるものの、いまいち使いどころが分かず。。。
こういう書き方もできるんだという発見がありましたので、まとめてみました。

配列の詳細を知りたい場合は、古い記事ですが↓を参考に
https://qiita.com/choplin/items/9d5e2ff8721fb9509bf8

ざっくり背景

バックアップテーブルを定期的に作成しているバッチがいて、バックアップテーブルも保存期間が来たら削除したいなーという要件がありました。
ただ、保存期間も一部のテーブルは長めに設定されていて、対象テーブルの一覧はpg_tablesから取得すればいいが、likenot 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条件と同じようになります。

おわりに

ORANDと同じ感じにと言われても、=<>の完全一致の条件しかなければinnot inを使えばいいとなるし、同一カラムで複数のlike条件が含まれるという、限られた状況だとは思うが結構シンプルに書き換えられているのではないかと思う。
(正規表現でやることも考えたが、正規表現を見ると拒否反応が…)

また、インデックスとかのパフォーマンスについては、特に考慮していないです。
この条件以外のところで、レコードは絞れている想定なので。

ほかに、こんな書き換えがあるよとか、間違ってるよとかありましたら、
指摘お願いしますm(_ _"m)

Discussion