SQL如何处理带有逗号分隔符的字符串拆分_通过STRING_SPLIT或正则

云晨酱_4426

云晨酱_4426

2026-05-20

691人浏览

原创

string_split在sql server 2016+中需满足三条件:版本≥2016且兼容级≥130;必须用cross/outer apply调用;参数为单字符分隔符。返回value列无序、含空值,需where过滤并慎用in子查询。

sql如何处理带有逗号分隔符的字符串拆分_通过string_split或正则

SQL Server 2016+ 直接用 STRING_SPLIT,别写自定义函数或 XML;低版本必须手动拆时,优先用递归 CTE 而非 WHILE 循环——后者在集合操作中性能差、难调试。

STRING_SPLIT 在 SQL Server 中怎么用才不出错

STRING_SPLIT 看似简单,但实际踩坑点集中在三处:参数类型、结果无序、空值处理。

  • string 和 separator 必须是单字符;传入 ',' 可以,但 ', '(逗号+空格)会报错或拆错
  • 返回结果默认无顺序保证,ORDER BY value 不等于原始位置顺序;需要序号得加 enable_ordinal = 1(仅 SQL Server 2022+ 或 Azure)
  • 输入字符串末尾带逗号(如 'a,b,c,')会多出一个空字符串行;WHERE value != '' 可过滤,但注意 value 是 nvarchar 类型,不能用 IS NOT NULL 判空
  • 不支持直接 JOIN 原表字段做多值匹配(如 WHERE col IN (SELECT value FROM STRING_SPLIT(...))),因为子查询无法关联外层;要用 CROSS APPLY

正确写法示例:

SELECT t.ID, s.value
FROM Orders t
CROSS APPLY STRING_SPLIT(t.ProductIDs, ',') s
WHERE LTRIM(RTRIM(s.value)) != '';

SQL Server 2014 及更早版本怎么安全拆分

不能用 STRING_SPLIT,XML 方案看似简洁,但对特殊字符(、<code>&、'')会解析失败;递归 CTE 是更可控的选择。

  • 必须给递归设置 OPTION (MAXRECURSION n),否则默认只跑 100 层,长字符串直接中断
  • 每次递归要截掉已处理部分,推荐用 SUBSTRING + CHARINDEX 组合,且在 CHARINDEX 的第三个参数显式指定起始位置,避免重复匹配
  • 原始字符串末尾不加哨兵字符(如逗号)也行,但需在递归终止条件里补全判断:CHARINDEX(',', Remaining) = 0
  • 记得用 ISNULL 或 NULLIF 处理空片段,否则 '' 和 NULL 混在一起难区分

最小可用递归模板:

WITH Split AS (
  SELECT 
    CAST(LEFT(@str, CHARINDEX(',', @str + ',') - 1) AS NVARCHAR(MAX)) AS value,
    STUFF(@str, 1, CHARINDEX(',', @str + ','), '') AS remaining
  UNION ALL
  SELECT 
    CAST(LEFT(remaining, CHARINDEX(',', remaining + ',') - 1) AS NVARCHAR(MAX)),
    STUFF(remaining, 1, CHARINDEX(',', remaining + ','), '')
  FROM Split
  WHERE remaining != ''
)
SELECT value FROM Split OPTION (MAXRECURSION 0);

为什么不该在 WHERE 里用 STRING_SPLIT 做 IN 匹配

常见错误写法:WHERE ProductID IN (SELECT value FROM STRING_SPLIT(@ids, ','))。这不是语法错误,但逻辑危险。

  • 如果 @ids 是空字符串或 NULL,STRING_SPLIT 返回空集,整个 IN 判断变成 WHERE ... IN () → 永远不成立,查不到任何数据,且不报错
  • 如果 @ids 含非法字符(如 Unicode 分隔符),STRING_SPLIT 可能静默跳过或截断,结果漏数据
  • 执行计划里,SQL Server 很可能把子查询当成“非相关子查询”,无法利用索引;而 CROSS APPLY 能触发嵌套循环优化
  • 真正需要“某字段值是否在逗号串中”时,应该反向思考:把逗号串转成表,再和主表 EXISTS 关联

安全替代写法:

SELECT *
FROM Products p
WHERE EXISTS (
  SELECT 1 FROM STRING_SPLIT(@target_ids, ',') s
  WHERE p.ProductID = s.value
);

最易被忽略的点:所有拆分方案都默认把连续逗号('a,,c')视作含空元素,但业务上往往要跳过空值;STRING_SPLIT 不提供过滤开关,必须靠外层 WHERE 显式剔除,且这个 WHERE 要放在 CROSS APPLY 之后、不能提前下推到函数内部。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4103

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

871

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1069

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5981

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2883

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5960

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7961

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1090

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

952

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习