Регулярное выражение в предложении PostgreSQL LIKE
Я застрял с простым регулярным выражением. Не знаю, что я упускаю. Немного подзабыл навыки выражения.
выражение, которое я пытаюсь сопоставить:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
Так что это должно соответствовать '0090D0DF143A'
(формат: текст), но это не так!
2 ответов
как @a_horse комментарием, вам придется использовать оператор регулярного выражения ~
использовать скобочных выражений.
Но это еще не все. Я предлагаю:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
.. совпадение в начале строки (ваше выражение может совпадать в любой позиция в строке).[^0]
.. скобочное выражение (класс символов), соответствующее любой символ, который не является '0'
.
или лучше, но:
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 может использовать простой btree индекс для выражений с левым якорем value LIKE '00%'
(важно для больших таблиц), хотя это может не работать для более сложных регулярных выражений. Последняя версия Postgres может использовать индексы для простых регулярных выражений, поэтому она может работа для этого примера. Подробности:
в PostgreSQL LIKE
оператор не поддерживает [в charlist], однако SIMILAR TO
делает.
Регистрация здесь для полного списка через DBs