単純な正規表現にこだわっています。何が欠けているかわからない。正規表現のスキルで少し錆びています。
私が一致させようとしている表現は:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
したがって、これは'0090D0DF143A'
(形式:テキスト)ですが、そうではありません!
@ 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が機能します。詳細:
PostgreSQLのLIKE
演算子は[charlist]をサポートしていませんが、SIMILAR TO
します。
[〜#〜]ここ[〜#〜] をチェックして、DB全体の包括的なリストを確認してください