Використання регулярного виразу в WHERE у Postgres


81

На даний момент я маю такий запит:

select regexp_matches(name, 'foo') from table;

Як я можу переписати це так, щоб регулярний вираз знаходився в де, як показано нижче (не працює):

select * from table where regexp_matches(name, 'foo');

Поточне повідомлення про помилку: ПОМИЛКА: аргумент WHERE повинен бути типовим, а не текстовим типом [] Стан SQL: 42804 Символ: 29

Відповіді:


141

Натомість напишіть:

select * from table where name ~ 'foo'

Оператор '~' видає логічний результат для відповідності регулярного виразу чи ні, а не за вилучення відповідних підгруп.


2
Чи існує альтернатива оператору ~? Я використовую бібліотеку javascript, яка аналізує запит, і, на жаль, вона не розпізнає ~ та будь-які їх варіанти.
Мартін

@Martin Ви можете спробувати використовувати схожі на який усічена підтримку регулярних виразів SELECT * FROM table WHERE name SIMILAR TO 'foo' Дивіться документацію тут для отримання більш докладної інформації
Джош Франкель

@JoshFrankel: Я десь читав (думаю, на stackoverflow), що SIMILAR TO має гіршу продуктивність.
Ніна

@Nina Можливо, я не впевнений у цьому. SIMILAR TO використовує функції регулярних виразів, але не реалізує їх повністю, що, можливо, робить це особливим випадком і, отже, менш продуктивним. Я віддаю перевагу ~оператору регулярних виразів, оскільки немає жодних сюрпризів щодо того, що реалізовано, а що не так, як це є у
Josh Frankel

@JoshFrankel: а як щодо цієї справи? codereview.stackexchange.com/questions/221146/... це питання я опублікував нещодавно
Ніна,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.