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

如何在SQL中提取Description列中带g的数值并拼接多值?

提取Description列中带'g'后缀的数值并拼接的SQL实现

需求说明

从包含DESCRIPTION列的表中,提取所有以字母g为后缀的整数或浮点数格式内容:

  • 存在多个符合条件的数值时,用/拼接
  • 无符合条件数值时返回NULL

示例数据

DESCRIPTION
someRandomt
it has 0.5g
23g is enou
otherRandom
55g, 0.1g,

期望查询结果

DESCRIPTION
NULL
0.5g
23g
NULL
55g/0.1g

不同数据库的SQL实现

MySQL/MariaDB

利用正则匹配提取目标内容,结合分组拼接实现需求:

SELECT 
    CASE 
        WHEN REGEXP_COUNT(description, '[0-9]+(\\.[0-9]+)?g') = 0 THEN NULL
        ELSE GROUP_CONCAT(DISTINCT REGEXP_SUBSTR(description, '[0-9]+(\\.[0-9]+)?g', 1, n) SEPARATOR '/')
    END AS DESCRIPTION
FROM 
    your_table
JOIN 
    (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS numbers
    ON n <= REGEXP_COUNT(description, '[0-9]+(\\.[0-9]+)?g')
GROUP BY 
    your_table.description;

注:numbers子查询的数字数量可根据实际最大匹配数调整,这里默认最多匹配4项。

PostgreSQL

通过正则匹配函数提取所有符合项,再进行字符串拼接:

SELECT 
    CASE 
        WHEN array_length(regexp_matches(description, '[0-9]+(\.[0-9]+)?g', 'g'), 1) IS NULL THEN NULL
        ELSE string_agg(match, '/')
    END AS DESCRIPTION
FROM 
    your_table,
    regexp_matches(description, '[0-9]+(\.[0-9]+)?g', 'g') AS matches(match)
GROUP BY 
    your_table.description;

SQL Server

借助拆分函数筛选目标内容,再用聚合拼接:

SELECT 
    CASE 
        WHEN COUNT(m.value) = 0 THEN NULL
        ELSE STRING_AGG(m.value, '/')
    END AS DESCRIPTION
FROM 
    your_table
CROSS APPLY (
    SELECT value
    FROM STRING_SPLIT(description, ' ')
    WHERE PATINDEX('%[0-9]%g', value) > 0 
      AND PATINDEX('%[^0-9.]%g', REPLACE(value, '.', '')) = LEN(value)
) AS m
GROUP BY 
    your_table.description;

内容的提问来源于stack exchange,提问作者Kristiyan Kotomanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:07:29