当前位置:首页 > 问答 > 正文

字符串处理|列表拆分 SQL Server:轻松将逗号分割字符串转换为列表,mssql 字符串分割方法

SQL Server 字符串分割指南:轻松把逗号分隔值变成查询利器

当数据挤在一个单元格里...

"小王,快帮我看看这个报表!客户发来的数据全都挤在一个单元格里,像'苹果,香蕉,橙子,西瓜'这样,我该怎么统计每种水果的数量啊?" 一大早,同事老张就火急火燎地跑来求助。

这种情况在数据处理中太常见了——用户输入、系统导出或接口返回的数据经常用逗号把多个值拼接在一个字段里,作为SQL Server开发者,掌握字符串分割技巧能让你从这种"数据疙瘩"中轻松解脱。

基础方法:STRING_SPLIT函数(SQL Server 2016+)

-- 最简单的分割方法
SELECT value 
FROM STRING_SPLIT('苹果,香蕉,橙子,西瓜', ',')

STRING_SPLIT是SQL Server 2016引入的专为这种场景设计的函数:

  • 第一个参数是要分割的字符串
  • 第二个参数是分隔符(不仅限于逗号)
  • 返回一个单列表,每行一个分割后的值

实际应用示例:

字符串处理|列表拆分 SQL Server:轻松将逗号分割字符串转换为列表,mssql 字符串分割方法

-- 创建测试表
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函数处理结果:

字符串处理|列表拆分 SQL Server:轻松将逗号分割字符串转换为列表,mssql 字符串分割方法

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:轻松将逗号分割字符串转换为列表,mssql 字符串分割方法

  • STRING_SPLIT平均耗时:约3秒
  • 自定义函数平均耗时:约12秒

注意事项

  1. STRING_SPLIT不保证返回结果的顺序与原始字符串一致
  2. 空值会被忽略,如'苹果,,西瓜'只会返回两行
  3. 分隔符只能是一个字符,不能用多字符分隔符

从SQL Server 2016开始,STRING_SPLIT让字符串分割变得异常简单,对于老版本,自定义函数也能解决问题,掌握这些技巧后,再遇到"挤在一起"的数据,你就能像拆乐高一样轻松把它们分解成有用的信息块了。

下次老张再来问类似问题,你可以自信地说:"简单,一个CROSS APPLY加STRING_SPLIT就搞定!"

发表评论