Поддерживает ли PostgreSQL \b
?
Я пытаюсь \bAB\b
, но он ничего не соответствует, тогда как (\W|^)AB(\W|$)
делает. Эти два выражения по существу одинаковы, не так ли?
Поддерживает ли PostgreSQL \b
?
Я пытаюсь \bAB\b
, но он ничего не соответствует, тогда как (\W|^)AB(\W|$)
делает. Эти два выражения по существу одинаковы, не так ли?
PostgreSQL использует \m
, \m
, \y
и \y
как границы слов:
\m matches only at the beginning of a word
\M matches only at the end of a word
\y matches only at the beginning or end of a word
\Y matches only at a point that is not the beginning or end of a word
См. Ограничения ограничения условных выражений в руководстве.
Существует также [[:<:]]
и [[:>:]]
, которые соответствуют началу и концу слова. Из руководство:
Существует два особых случая выражения скобок: выражения скобки
[[:<:]]
и[[:>:]]
являются ограничениями, соответствующими пустым строкам в начале и конце слова соответственно. Слово определяется как последовательность словных символов, которые не предшествуют и не сопровождаются символами слов. Символ слова является символом alnum (как определено ctype) или подчеркиванием. Это расширение, совместимое, но не указанное POSIX 1003.2, и его следует использовать с осторожностью в программном обеспечении, предназначенном для переносимости в другие системы. Обычно предпочтительные ограничения, описанные ниже, являются предпочтительными (они не являются более стандартными, но, безусловно, легче печатать).
Простой пример
select * from table_name where column ~* '\yAB\y';
Это будет работать в 9.1 и matche AB
AB
ab - text
text ab
text ab
text-ab-text
text AB text
...
Но вы должны быть осторожны в 9.2. вы должны использовать:
select * from sometable where name ~* '\\yAB\\y';
Обратите внимание на двойные косые черты.
В 9.2 для параметра standard_conforming_strings
установлено значение OFF
по умолчанию. Но вы можете установить его вручную:
set standard_conforming_strings=on;
Затем: select * from table_name where column ~* '\yAB\y';
должен работать.
Точный поиск слова в тексте:
У меня возникла следующая проблема.
Я хотел искать все контакты, которые имеют "cto" как точное слово в заголовках, но в результатах получались результаты с названием "Director" в нем, я использовал следующий запрос
select * from contacts where title ilike '%cto%';
Я также пробовал с whitspaces вокруг wildcard как "% cto%", он соответствовал тексту, который содержит "cto", получил результаты, такие как "vp, cto и manger", но не результаты с точным заголовком как "cto",
Я хотел, чтобы результаты "vp, cto и manger" и "cto" были получены, но не "директор" в результатах
После меня работали
select * from contacts where title ~* '\\ycto\\y';
~ Matches regular expression, case sensitive
~* Matches regular expression, case insensitive