几种分割字符串实现方法的比较
2016-04-22 23:54
375 查看
在数据库开发中,有时会遇到把字符串,按一定规则进行分割,比如“a,b,c,1,2,3”这样的以逗号为分隔符的字符串,需要把分割出来,分割后单独变行一行记录。首先想到的是使用替换函数把分隔符去掉。于是有了:
该方法拼接SQL语句,简单巧妙,但有不足。(1)拼接的SQL不够直观,较难编写;(2)如果分隔符是半角的英文单引号的话,需要再作处理;(3)某些
情况下,如果字符串有中文等非英文字符,会显示乱码;(4)由于拼接的SQL,如果要分割的字符串很长很长,那么拼接的SQL可能会过长,而不能被执行。
所以这种方法只能作简单的替换或开拓思维之用。
方法2(推荐):
封装成函数,方便调用,并且不会出现方法1中的问题。
方法3(来自网络):
方法4(来自网络):
后面两种方法也是过于复杂,并且也有不足。
IF (OBJECT_ID(N'Tempdb..##T1') IS NOT NULL) BEGIN DROP TABLE ##T1; END GO DECLARE @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; GOCode-1: 方法1
该方法拼接SQL语句,简单巧妙,但有不足。(1)拼接的SQL不够直观,较难编写;(2)如果分隔符是半角的英文单引号的话,需要再作处理;(3)某些
情况下,如果字符串有中文等非英文字符,会显示乱码;(4)由于拼接的SQL,如果要分割的字符串很长很长,那么拼接的SQL可能会过长,而不能被执行。
所以这种方法只能作简单的替换或开拓思维之用。
方法2(推荐):
IF OBJECT_ID(N'fn_split_rowno') IS NOT NULL BEGIN DROP FUNCTION fn_split_rowno; END GO CREATE FUNCTION fn_split_rowno ( @str NVARCHAR(MAX) ,@split NVARCHAR(20) = ',' ) RETURNS @t TABLE(row_no INT ,col NVARCHAR(500)) AS BEGIN 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) RETURN END GOCode-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 result FROM ( 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 '%,' ) t ORDER 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('<Root><item><S>' + REPLACE(@string ,',' ,'</S></item><item><S>') + '</S></item></Root>' AS XML) EXEC sp_xml_preparedocument @Idoc OUTPUT,@doc SELECT * FROM OPENXML(@Idoc ,'/Root/item' ,2) WITH ([S] VARCHAR(10)) GOCode-4: 方法4
后面两种方法也是过于复杂,并且也有不足。
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- 如何成为一名专家级的开发人员
- DB2实例管理
- DB2实例管理
- gitinspector+jenkins 开发代码统计CI
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 第三章 数据库备份和还原
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle数据库执行脚本常用命令小结
- Oracle 数据库 临时数据的处理方法