#regex #postgresql #position #substring
#регулярное выражение #postgresql #позиция #подстрока
Вопрос:
У меня есть строка, подобная
We would like to approve your call, however you have been denied because of reasons
Я хочу извлечь последнее появление либо «утвердить ваш вызов», либо «было отклонено» для участника, которое указывает, было ли оно одобрено или отклонено. Я должен использовать конкретные подстроки, поскольку это основано на форме, а не просто «одобрить» и «отклонить».
Моя идея состояла в том, чтобы использовать regexp_match для извлечения всех отображений, а затем захватить последнюю строку, однако нет способа получить последнюю строку из результата regexp_match.
Ответ №1:
В Postgres 9.4 вы можете использовать WITH ORDINALITY
для определения последней строки в regexp_matches
результате:
SELECT m
FROM regexp_matches('abc', '.', 'g') WITH ORDINALITY r(m,n)
ORDER BY n DESC
LIMIT 1
В более старых версиях вы можете сделать это с помощью функции window (хотя она зависит от естественного порядка результирующего набора, чего обычно лучше избегать):
SELECT last_value(m) OVER ()
FROM regexp_matches('abc', '.', 'g') r(m)
LIMIT 1
Комментарии:
1. Ах! эта оконная функция будет работать. На основе тестирования natural_ordering regexp_matches представляется лексическим порядком, поэтому я думаю, что это будет хорошим исправлением