Как создать обобщенное регулярное выражение (POSIX) в PostgreSQL?

В postgreSQL (9.5), PgAdmin III, я хотел бы обобщить этот оператор POSIX на два слова:

Это работает для слов «новое» и «промежуточное» со слоями:

select * from cpt where cdesc ~* '^(?=.*mnewM)(?=.*mintermediateM)'

Это не удается (аргумент «где» рассматривается как текстовая строка):

select * from cpt where cdesc ~* '^(?=.*m'||'new'||'M)(?=.*mintermediateM)'

Как это можно записать для обобщенной функции, например:

CREATE OR REPLACE FUNCTION getDesc(string1 text, string2 text)
  RETURNS SETOF cpt AS
$BODY$ 

select * from cpt where cdesc ~* '^(?=.*m$1M)(?=.*m$2M)'

$BODY$
  LANGUAGE sql VOLATILE;

(где $ 1 - строка1, а $ 2 - строка2)

ТИА

Редактировать. Соответствующие укусы в cdesc будут:

  • «Это новая и промежуточная художественная работа»
  • «Это промежуточное и новое произведение искусства»

Несоответствие:

  • «Это новое искусство»
  • «Это промежуточное искусство»

Обратите внимание, что порядок слов не важен, пока оба присутствуют. Кроме того, любое слово может иметь знак пунктуации - (запятая или период) - сразу после слова (без пробела).

regex,postgresql,posix,

0

Ответов: 1


1 "> принят

Мое первое предложение состояло в том, чтобы разделить дорогое регулярное выражение на два предложения SQL WHERE и:

  • соответствие с LIKE, так как это намного быстрее, вы можете фильтровать код для более конкретных совпадений,
  • или сопоставление с простым регулярным выражением, что-то вроде ' m $ 1 [ M ,.]'

Что касается регулярного выражения, которое вы используете:

  • Я не использовал его некоторое время, но я думаю, что вам нужна скобка для объединения строк

~* ( '^(?=.*m' || 'new' || 'M)(?=.*mintermediateM)' )

регулярное выражение, PostgreSQL, POSIX,
Похожие вопросы