web-dev-qa-db-ja.com

列が複数の値を好まない場合

ユーザー名が文字列のリストとは異なる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];
8
Jeff

ほぼ正しい構文でした。これはまさにあなたが望むものです:

SELECT * FROM Rails_db WHERE username NOT LIKE ALL(ARRAY[my values]);

これは非常に良い構文ですが、特に配列が大きい場合は特に、必ずしも高速になるとは限りません。ただし、必要なものをパフォーマンスのために最適化するのは難しく、醜い構文の方が速くなると考える理由はありません。

12
jjanes

私はそれを見つけたかもしれませんが、これが想定どおりに機能するかどうかを確認したいと思います。

SELECT * FROM Rails_db WHERE username !~* 'j.*|.*eepy.*';
1
Jeff

ブランチで正規表現を使用するという考えは確かです。しかし あなたの答えでLIKEパターンの特殊文字%の翻訳が間違っています。

この:

... WHERE username NOT LIKE 'j%' AND username NOT LIKE '%eepy%';

に変換します:

... WHERE username !~ '^j|eepy';

!~NOT LIKEのように大文字と小文字を区別します。
!~* を使用して、NOT ILIKEのように大文字と小文字を区別せずに一致させます。
また、ドットを含む文字列を除外するには(.anywhereと、一致する(一致しない)別の例を使用してendusername NOT LIKE '%end'のような文字列:

... WHERE username !~ '^j|end$|eepy|\.';

おそらくあまり速くもありません。

1
with help(term) as (values('T%'),('STAG%'))
select tabschema, tabname
from syscat.indexes
where not exists (select 1 from help where tabschema like term)
0
Jürgen Götz