Простое регулярное выражение для фильтрации префиксных и суффиксных символов - PullRequest
0 голосов
/ 13 ноября 2018

В моей базе данных есть поле, в котором есть длинный список строк, разделенных запятыми. Вот несколько примеров строк:

HAB
DHAB,RAB,DAB
HAB,RAB,DAB
RAB,HAB, 
RAB,HAB,DAB

Мой запрос имеет следующее условие:

WHERE description LIKE '%HAB%'

Но он возвращает второй ряд, в котором есть «DHAB».
Можно ли это сделать с помощью регулярного выражения с оператором WHERE, чтобы я получал только записи, в списке которых есть «HAB» (одна строка), а не записи с «DHAB»?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Регулярные выражения являются мощными и универсальными, но и дорогими. Рассмотрим другой подход: преобразовать список в фактический массив с string_to_array(), а затем:

WHERE 'HAB' = ANY (string_to_array(description, ',')

Или:

WHERE  string_to_array(description, ',') @> '{HAB}'

дБ <> скрипка здесь

Последний может поддерживаться индексом GIN , что ускоряет его на несколько порядков для больших таблиц.

CREATE INDEX ON tbl USING gin (string_to_array(description, ','));

Связанный:

Или рассмотрите нормализованный дизайн БД, заменив запятые значения отношением 1: n. Связанный:

0 голосов
/ 13 ноября 2018

Вы можете использовать

WHERE description ~ '(^|,)HAB($|,)'

Регламент соответствует

  • (^|,) - начало строки или ,
  • HAB - литералподстрока
  • ($|,) - конец строки или ,

См. онлайн-демонстрацию регулярных выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...