2016-10-12 3 views
1

Я получил строку какPostgres: Извлечь последнюю подстроку в строке

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 function (хотя она рассчитывает на естественном порядке из набора результатов, которого, как правило, лучше всего избегать):

SELECT last_value(m) OVER() 
FROM regexp_matches('abc', '.', 'g') r(m) 
LIMIT 1 
+0

Ah! эта функция окна будет работать. На основе тестирования естественное_значение regexp_matches кажется лексическим упорядочением, поэтому я думаю, что это будет хорошее исправление – aa260022