web-dev-qa-db-ja.com

PostgreSQL LIKE句の正規表現

単純な正規表現にこだわっています。何が欠けているかわからない。正規表現のスキルで少し錆びています。

私が一致させようとしている表現は:

select * from table where value like '00[1-9]%'
-- (third character should not be 0)

したがって、これは'0090D0DF143A'(形式:テキスト)ですが、そうではありません!

19
borarak

@ a_horse commented のように、- ブラケット式 を使用するには、 正規表現演算子~ を使用する必要があります。
しかし、まだまだあります。私は提案します:

SELECT *
FROM   tbl
WHERE  value ~ '^00[^0]'

^ ...文字列の先頭で一致します(元の式はanyの位置で一致する可能性があります)。
[^0] ...一致するブラケット式(文字クラス)any0ではない文字。

またはbetter、まだ:

SELECT *
FROM   tbl
WHERE  value LIKE '00%'       -- starting with '00'
AND    value NOT LIKE '000%'  -- third character is not '0'

どうして? LIKEはそれほど強力ではありませんが、通常は正規表現より高速です。安価なLIKE式を使用して候補のセットを絞り込む方が、おそらくかなり高速です。

通常はNOT LIKE '__0'を使用しますが、他の述語でLIKE '00%'をすでに確立しているため、より狭い(より安い)パターンNOT LIKE '000'を使用できます。

Postgresは左アンカー式value LIKE '00%'(大きなテーブルでは重要)に単純なbtreeindexを使用できますが、より複雑な正規表現。 Postgresの最新バージョンは単純な正規表現にインデックスを使用できるため、この例ではmightが機能します。詳細:

30

PostgreSQLのLIKE演算子は[charlist]をサポートしていませんが、SIMILAR TOします。

[〜#〜]ここ[〜#〜] をチェックして、DB全体の包括的なリストを確認してください

0
sunbabaphu