Postgres: извлечение последней подстроки в строке

#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 представляется лексическим порядком, поэтому я думаю, что это будет хорошим исправлением