Попытка написать SQL-запрос с помощью regexp_matches () выглядит положительно в postgresql - PullRequest
0 голосов
/ 18 мая 2018

Из базы данных PostgreSQL я пытаюсь сопоставить 6 или более цифр, которые идут после строки, которая выглядит как «(OCoLC)», и я подумал, что у меня есть рабочее регулярное выражение, которое соответствует этому описанию:

(?<=\(ocolc\))[0-9]{6,}

Вот некоторые строки, для которых должны возвращаться цифры:

|a(OCoLC)08507541 вернет 08507541

|a(OCoLC)174097142 вернет 174097142

и т.д ...

Кажется, это работает для сопоставления строк, когда я тестирую его на regex101.com, но когда я включаю его в свой запрос:

SELECT
regexp_matches(v.field_content, '(?<=\(ocolc\))[0-9]{6,}', 'gi')

FROM
varfield as v

LIMIT 
1;

Я получаю это сообщение:

ERROR: invalid regular expression: quantifier operand invalid

Я не уверен, почему ему не нравится это выражение.

ОБНОВЛЕНИЕ В итоге я просто прибег к использованию заявления случая, так как это, казалось, лучший способ обойти это ...

SELECT
CASE
    WHEN v.field_content ~* '\(ocolc\)[0-9]{6,}' 
    THEN (regexp_matches(v.field_content, '[0-9]{6,}', 'gi'))[1]
    ELSE v.field_content
END

FROM
varfield as v

, как заметил Electricjelly, я вроде после только числовых символов, но им должна предшествовать строка "(OCoLC)", иначе они не совсем то, что я ищу.Это часть более крупного запроса, поэтому я запускаю второй оператор case с логическим флагом в тех случаях, когда начало строки не было "(OCoLC)".В любом случае это кажется более полезным, поскольку я, вероятно, захочу как-то сохранить эти другие значения.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

После просмотра вашего вопроса кажется, что ваша ошибка вызвана синтаксической проблемой, а не столько функцией, которая недоступна в вашей версии PostgreSQl, как я тестировал ее на 9.6 и получил ту же ошибку.

Однако вам, похоже, нужно извлечь числа из заданного поля, как в

|a(OCoLC)08507541 становится 08507541

простым способом, которым вы могли бы добиться этого, было быиспользуйте regex_replace

функция будет выглядеть так:

regexp_replace('table.field', '\D', '', 'g')

\D в функции находит все не числа и заменяет ее ничем (следовательно, '') и возвращает все остальное

0 голосов
/ 18 мая 2018

Похоже, что после дополнительного поиска, это только особенность версий сервера PostgreSQL> = 9.6

https://www.postgresql.org/docs/9.6/static/functions-matching.html#POSIX-CONSTRAINTS-TABLE

Версия, которую я запускаю, - это версия 9.4.6

https://www.postgresql.org/message-id/E1ZsIsY-0006z6-6T@gemulon.postgresql.org

Таким образом, ответ заключается в том, что он недоступен для этой версии PostgreSQL, но, вероятно, это будет прекрасно работать в последней версии сервера.

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