Чтобы отказаться от чтения всей проблемы, мой основной вопрос:
Есть ли в PostgreSQL функция для экранирования символов регулярного выражения в строке?
Я изучил документацию, но не смог найти такую функцию.
Вот полная проблема:
В базе данных PostgreSQL у меня есть столбец с уникальными именами.У меня также есть процесс, который периодически вставляет имена в это поле, и, для предотвращения дублирования, если ему нужно ввести имя, которое уже существует, он добавляет пробел и круглые скобки со счетчиком в конец.
т.е.Имя, Имя (1), Имя (2), Имя (3) и т. Д.
В его нынешнем виде я использую следующий код для поиска следующего числа, которое необходимо добавить в серию (написано в plpgsql):
var_name_id := 1;
SELECT CAST(substring(a.name from E'\\((\\d+)\\)$') AS int)
INTO var_last_name_id
FROM my_table.names a
WHERE a.name LIKE var_name || ' (%)'
ORDER BY CAST(substring(a.name from E'\\((\\d+)\\)$') AS int) DESC
LIMIT 1;
IF var_last_name_id IS NOT NULL THEN
var_name_id = var_last_name_id + 1;
END IF;
var_new_name := var_name || ' (' || var_name_id || ')';
(var_name
содержит имя, которое я пытаюсь вставить.)
Пока это работает, но проблема заключается в выражении WHERE
:
WHERE a.name LIKE var_name || ' (%)'
Эта проверка не проверяет, является ли рассматриваемый %
числом, и не учитывает несколько круглых скобок, как в чем-то вроде «Name ((1))», и если существует какой-либо случайбудет брошено исключение приведения.
Оператор WHERE
действительно должен быть чем-то вроде:
WHERE a.r1_name ~* var_name || E' \\(\\d+\\)'
Но var_name
может содержать символы регулярного выражения, что приводит к вопросувыше: есть ли в PostgreSQL функция, которая экранирует обычныенажмите на символы в строке, чтобы я мог сделать что-то вроде:
WHERE a.r1_name ~* regex_escape(var_name) || E' \\(\\d+\\)'
Любые предложения приветствуются, включая возможную переработку моего решения для дублирующих имен.