ユーザー名が文字列のリストとは異なるpostgresql dbのレコードを選択しようとしています。
SELECT * FROM Rails_db WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';
問題は、これらの値がたくさんあることです。それらの配列を作成して次のように言う方法はありますか?
SELECT * FROM Rails_db WHERE username NOT LIKE ARRAY[my values];
ほぼ正しい構文でした。これはまさにあなたが望むものです:
SELECT * FROM Rails_db WHERE username NOT LIKE ALL(ARRAY[my values]);
これは非常に良い構文ですが、特に配列が大きい場合は特に、必ずしも高速になるとは限りません。ただし、必要なものをパフォーマンスのために最適化するのは難しく、醜い構文の方が速くなると考える理由はありません。
私はそれを見つけたかもしれませんが、これが想定どおりに機能するかどうかを確認したいと思います。
SELECT * FROM Rails_db WHERE username !~* 'j.*|.*eepy.*';
ブランチで正規表現を使用するという考えは確かです。しかし あなたの答えでLIKE
パターンの特殊文字%
の翻訳が間違っています。
この:
... WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';
に変換します:
... WHERE username !~ '^j|eepy';
!~
はNOT LIKE
のように大文字と小文字を区別します。!~*
を使用して、NOT ILIKE
のように大文字と小文字を区別せずに一致させます。
また、ドットを含む文字列を除外するには(.
)anywhereと、一致する(一致しない)別の例を使用してendのusername NOT LIKE '%end'
のような文字列:
... WHERE username !~ '^j|end$|eepy|\.';
おそらくあまり速くもありません。
with help(term) as (values('T%'),('STAG%'))
select tabschema, tabname
from syscat.indexes
where not exists (select 1 from help where tabschema like term)