几种分割字符串实现方法的比较
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,在数据库开发中,有时会遇到把字符串,按一定规则进行分割,比如"a,b,c,1,2,3"这样的以逗号为分隔符的字符串,需要把分割出来,分割后单独变行一行记录。首先想到的是使用替换函数把分隔符去掉。于是有
千家信息网最后更新 2025年11月06日几种分割字符串实现方法的比较
在数据库开发中,有时会遇到把字符串,按一定规则进行分割,比如"a,b,c,1,2,3"这样的以逗号为分隔符的字符串,需要把分割出来,分割后单独变行一行记录。首先想到的是使用替换函数把分隔符去掉。于是有了:
IF (OBJECT_ID(N'Tempdb..##T1') IS NOT NULL)BEGIN DROP TABLE ##T1;ENDGODECLARE @string NVARCHAR(MAX);SET @string=N'123,abc,456,AAA,DDD';SET @string=N'SELECT * INTO ##T1 FROM (SELECT ''' + REPLACE(@string,',',''' AS result UNION ALL SELECT ''') + ''') a' ;EXEC(@string);SELECT * FROM ##T1;GO
Code-1: 方法1
该方法拼接SQL语句,简单巧妙,但有不足。(1)拼接的SQL不够直观,较难编写;(2)如果分隔符是半角的英文单引号的话,需要再作处理;(3)某些 情况下,如果字符串有中文等非英文字符,会显示乱码;(4)由于拼接的SQL,如果要分割的字符串很长很长,那么拼接的SQL可能会过长,而不能被执行。 所以这种方法只能作简单的替换或开拓思维之用。
方法2(推荐):
IF OBJECT_ID(N'fn_split_rowno') IS NOT NULLBEGIN DROP FUNCTION fn_split_rowno;ENDGOCREATE FUNCTION fn_split_rowno( @str NVARCHAR(MAX) ,@split NVARCHAR(20) = ',')RETURNS @t TABLE(row_no INT ,col NVARCHAR(500))ASBEGIN DECLARE @i INT SET @i = 0 WHILE (CHARINDEX(@split ,@str) <> 0) BEGIN INSERT @t (row_no,col) VALUES(@i + 1,SUBSTRING(@str ,1 ,CHARINDEX(@split ,@str) -1)) SET @str = STUFF(@str ,1 ,CHARINDEX(@split ,@str) + LEN(@split) -1 ,'') SET @i = @i + 1 END IF (@str <> '') INSERT @t (row_no,col) VALUES(@i + 1 ,@str) RETURNENDGO
Code-2: 方法2(推荐)
封装成函数,方便调用,并且不会出现方法1中的问题。
SELECT * FROM fn_split_rowno(N'123,abc,456,AAA,DDD,51CTO',',')
Code-3: 调用函数
方法3(来自网络):
DECLARE @string NVARCHAR(MAX)SET @string = N'123,abc,456,AAA,DDD,博客园'SELECT REPLACE(REVERSE((LEFT(s ,CHARINDEX(',' ,s)))) ,',' ,'') AS resultFROM ( SELECT r,REVERSE(LEFT(@string ,r)) + ',' AS s FROM ( SELECT ( SELECT COUNT(*) FROM sys.objects WHERE NAME <= t.name ) AS r FROM sys.objects AS t ) a WHERE r <= LEN(@string) AND LEFT(@string + ',' ,r + 1) LIKE '%,' ) tORDER BY rCode-3: 方法3
方法4(来自网络):
DECLARE @string NVARCHAR(MAX) SET @string = N'123,abc,456,AAA,DDD'DECLARE @idoc INT; DECLARE @doc XML; SET @doc = CAST('' + REPLACE(@string ,',' ,'') + ' ' AS XML)EXEC sp_xml_preparedocument @Idoc OUTPUT,@docSELECT * FROM OPENXML(@Idoc ,'/Root/item' ,2) WITH ([S] VARCHAR(10)) GOCode-4: 方法4
后面两种方法也是过于复杂,并且也有不足。
方法
字符
字符串
函数
分隔符
网络
英文
推荐
复杂
巧妙
直观
一行
不够
乱码
半角
博客
引号
思维
情况
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云服务器管理网站
b站上有没有数据库
做软件开发前景好吗
物理网络安全概念股
软件开发的环境因素的识别
数据库重插
网页换服务器后台图片
聊天记录会存在数据库表吗
关于网络安全我参与的手抄报
中国网络安全设备主流品牌
服务器安全应急预案
教育局网络安全专项治理
无限时空网络技术有限公司
sql数据库错误修复
原神如何查看自己所在服务器
软件开发行业动向
山东软件开发者公司
数据库管理系统三级模式结构缺点
光遇服务器补偿三颗爱心
软件开发路线有哪些
编程与软件开发的区别
关系和非关系型数据库
流能存储在数据库中吗
集合字段数据库
大运会网络安全卫士
web数据库的安全性
网络安全专业在全国的认可度
远程服务器连接错误
服务器版和一体机版
口袋动画远程服务器返回错误