PostgreSQL 16中如何获取正则表达式的第二个匹配结果?
PostgreSQL 16 获取正则第二个匹配值的方法
你的原查询有两个核心问题:
regexp_matches默认只返回第一个匹配结果,不加全局匹配标志不会输出所有符合条件的行;- 你的正则表达式里只有一个捕获组
(\d+)%,用[2]访问不存在的第二个捕获组,自然返回空。
要获取第二个匹配值,正确操作如下:
- 给正则加上
g全局匹配标志,让函数返回所有匹配结果; - 定位到第二行结果,再取唯一捕获组的值(用
[1])。
方法一:用 OFFSET 直接定位第二行
SELECT (regexp_matches('Main fabric: 50% Organic Cotton, 49% Cotton, 1% Elastane', '\b(\d+)%', 'g'))[1] OFFSET 1 LIMIT 1;
执行后会直接返回第二个匹配的数值 49。
方法二:聚合为数组后取第二个元素
如果需要保留所有匹配结果后续复用,可以先把所有值聚合为数组,再访问第二个元素:
SELECT (array_agg(match[1]))[2] FROM regexp_matches('Main fabric: 50% Organic Cotton, 49% Cotton, 1% Elastane', '\b(\d+)%', 'g') AS match;
同样会得到预期的 49。
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

