上一篇
"小王,快帮我看看这个报表!客户发来的数据全都挤在一个单元格里,像'苹果,香蕉,橙子,西瓜'这样,我该怎么统计每种水果的数量啊?" 一大早,同事老张就火急火燎地跑来求助。
这种情况在数据处理中太常见了——用户输入、系统导出或接口返回的数据经常用逗号把多个值拼接在一个字段里,作为SQL Server开发者,掌握字符串分割技巧能让你从这种"数据疙瘩"中轻松解脱。
-- 最简单的分割方法 SELECT value FROM STRING_SPLIT('苹果,香蕉,橙子,西瓜', ',')
STRING_SPLIT是SQL Server 2016引入的专为这种场景设计的函数:
实际应用示例:
-- 创建测试表 CREATE TABLE 订单 ( 订单ID INT PRIMARY KEY, 商品列表 VARCHAR(200) ) -- 插入测试数据 INSERT INTO 订单 VALUES (1, '手机,充电器,耳机'), (2, '笔记本,鼠标'), (3, '键盘,鼠标垫,USB扩展坞') -- 查询每个订单中的商品 SELECT 订单ID, value AS 商品 FROM 订单 CROSS APPLY STRING_SPLIT(商品列表, ',')
输出结果:
订单ID 商品
------ ------
1 手机
1 充电器
1 耳机
2 笔记本
2 鼠标
3 键盘
3 鼠标垫
3 USB扩展坞
实际数据往往不完美,可能会有多余空格:
-- 数据包含多余空格的情况 SELECT value FROM STRING_SPLIT(' 苹果 , 香蕉 , 橙子 , 西瓜 ', ',')
解决方法是用TRIM函数处理结果:
SELECT TRIM(value) AS 干净值 FROM STRING_SPLIT(' 苹果 , 香蕉 , 橙子 , 西瓜 ', ',')
如果你的SQL Server版本低于2016,可以创建自定义函数:
CREATE FUNCTION dbo.SplitString ( @字符串 NVARCHAR(MAX), @分隔符 CHAR(1) ) RETURNS @结果 TABLE (值 NVARCHAR(MAX)) AS BEGIN DECLARE @位置 INT DECLARE @片段 NVARCHAR(MAX) WHILE CHARINDEX(@分隔符, @字符串) > 0 BEGIN SET @位置 = CHARINDEX(@分隔符, @字符串) SET @片段 = LEFT(@字符串, @位置 - 1) INSERT INTO @结果 (值) VALUES (LTRIM(RTRIM(@片段))) SET @字符串 = RIGHT(@字符串, LEN(@字符串) - @位置) END INSERT INTO @结果 (值) VALUES (LTRIM(RTRIM(@字符串))) RETURN END
使用方式:
SELECT * FROM dbo.SplitString('苹果,香蕉,橙子,西瓜', ',')
-- 统计所有订单中各类商品的购买次数 SELECT TRIM(value) AS 商品, COUNT(*) AS 购买次数 FROM 订单 CROSS APPLY STRING_SPLIT(商品列表, ',') GROUP BY TRIM(value) ORDER BY 购买次数 DESC
处理大量数据时,STRING_SPLIT性能优于自定义函数,测试显示,在100万行数据上:
从SQL Server 2016开始,STRING_SPLIT让字符串分割变得异常简单,对于老版本,自定义函数也能解决问题,掌握这些技巧后,再遇到"挤在一起"的数据,你就能像拆乐高一样轻松把它们分解成有用的信息块了。
下次老张再来问类似问题,你可以自信地说:"简单,一个CROSS APPLY加STRING_SPLIT就搞定!"
本文由 冠觅 于2025-08-03发表在【云服务器提供商】,文中图片由(冠觅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/526113.html
发表评论