PostgreSQL 16如何从产品描述中提取第二种材质名称?
PostgreSQL 16 提取第二种材质名称的正确方法
原SQL语句无法返回数据的原因有两个:
- 正则里的
(.+)是贪婪匹配,第一次匹配就会把%后面的所有内容(包括后续的材质和逗号)全部吞掉,没法定位到单个材质。 - 使用
g全局修饰符后,regexp_matches会返回多行结果(每个匹配占一行),而不是将所有匹配结果放在一个数组里,因此[2]根本取不到对应值。
方法一:精准正则定位第二个材质
用非捕获组跳过前一个材质的内容,直接捕获第二个材质:
SELECT (regexp_match('Main fabric: 50% Organic Cotton, 49% Cotton, 1% Elastane', '(?:.*?% ){2}(.*?)(?:,|$)'))[1];
正则说明:
(?:.*?% ){2}:非捕获组,非贪婪匹配前两个%的完整内容(跳过第一个材质)(.*?):捕获第二个材质名称,非贪婪匹配到逗号或字符串结尾(?:,|$):非捕获组,匹配材质后的分隔符(逗号)或字符串结尾
方法二:拆分所有材质后取第二个
先全局匹配所有材质,再通过偏移量取第二个:
SELECT material FROM ( SELECT (regexp_matches('Main fabric: 50% Organic Cotton, 49% Cotton, 1% Elastane', '\d+% (.+?)(?:,|$)', 'g'))[1] AS material ) AS materials OFFSET 1 LIMIT 1;
这个方法先提取所有材质名称(全局匹配每个百分比后的内容),再用OFFSET 1跳过第一个材质,LIMIT 1取第二个。
方法三:用字符串拆分函数简化操作
先移除前缀,再拆分材质列表:
SELECT split_part(split_part('Main fabric: 50% Organic Cotton, 49% Cotton, 1% Elastane', '% ', 3), ',', 1);
说明:
- 第一次
split_part按%拆分,取第3段(跳过前缀和第一个材质) - 第二次
split_part按逗号拆分,取第一段就是第二个材质名称
内容的提问来源于stack exchange,提问作者Andrus
相关产品推荐
相关产品推荐

