Postgres:提取字符串中的最后一个子字符串

Postgres: Extract the last substring in a string

我有一个像

这样的字符串
We would like to approve your call, however you have been denied because of reasons

我想提取主体上 "approve your call" 或 "have been denied" 的 last 外观,表明它是被批准还是被拒绝。我必须使用特定的子字符串,因为这是基于一种形式,而不仅仅是 "approve" 和 "decline".

我的想法是用regexp_match把所有出现的都拉出来然后抓取最后一行,但是没有办法从regexp_match的结果中得到最后一行。

在 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