请求实现:从单列拆分姓名与薪资并按姓名汇总薪资
解决方案:拆分姓名与薪资并按姓名汇总求和
没问题,这是个很常见的字符串拆分+聚合统计需求,先明确你的需求:
输入:
col_details列包含值Sam100、Ram200、Sam1000、Ram50000、Aryan450
期望输出:生成含col_name和col_salary的结果集,其中Sam对应1100、Ram对应50200、Aryan对应450。
下面是几种主流数据库的实现方案:
MySQL 实现
利用正则表达式函数拆分字符串,再分组求和:
SELECT REGEXP_SUBSTR(col_details, '[A-Za-z]+') AS col_name, SUM(CAST(REGEXP_REPLACE(col_details, '[A-Za-z]+', '') AS UNSIGNED)) AS col_salary FROM your_table GROUP BY col_name ORDER BY col_name;
REGEXP_SUBSTR(col_details, '[A-Za-z]+'):提取col_details中的所有英文字母作为姓名REGEXP_REPLACE(col_details, '[A-Za-z]+', ''):移除所有字母,得到薪资数字字符串,转成无符号整数后求和- 最后按姓名分组,得到每个用户的总薪资
SQL Server 实现
通过PATINDEX定位数字起始位置来拆分:
SELECT LEFT(col_details, PATINDEX('%[0-9]%', col_details) - 1) AS col_name, SUM(CAST(SUBSTRING(col_details, PATINDEX('%[0-9]%', col_details), LEN(col_details)) AS INT)) AS col_salary FROM your_table GROUP BY LEFT(col_details, PATINDEX('%[0-9]%', col_details) - 1) ORDER BY col_name;
PATINDEX('%[0-9]%', col_details):找到字符串中第一个数字的位置LEFT(...):截取数字之前的所有字符作为姓名SUBSTRING(...):截取从第一个数字到末尾的字符作为薪资,转成整数后求和
PostgreSQL 实现
PostgreSQL原生支持正则匹配的字符串截取:
SELECT SUBSTRING(col_details FROM '[A-Za-z]+') AS col_name, SUM(SUBSTRING(col_details FROM '[0-9]+')::INT) AS col_salary FROM your_table GROUP BY col_name ORDER BY col_name;
SUBSTRING(col_details FROM '[A-Za-z]+'):直接提取字母部分作为姓名SUBSTRING(col_details FROM '[0-9]+')::INT:提取数字部分并转成整数,求和后按姓名分组
注意事项
- 确保
col_details的格式是纯字母+纯数字的组合,如果存在特殊字符(如下划线、空格),需要调整正则表达式(比如MySQL用[[:alpha:]]匹配所有字母类字符) - 如果薪资包含小数,将
INT/UNSIGNED替换为DECIMAL(10,2)或FLOAT类型 - 如果姓名包含非英文字母(如带重音的字符),要对应调整正则的匹配范围
内容的提问来源于stack exchange,提问作者Aryan Sena
相关产品推荐
相关产品推荐

