如何在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
相关产品推荐
相关产品推荐

