You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 16如何从产品描述中提取第二种材质名称?

PostgreSQL 16 提取第二种材质名称的正确方法

原SQL语句无法返回数据的原因有两个:

  1. 正则里的(.+)是贪婪匹配,第一次匹配就会把% 后面的所有内容(包括后续的材质和逗号)全部吞掉,没法定位到单个材质。
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:52:14