Регулярное выражение в предложении 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