博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
04. 字符串合并与拆分写法小结
阅读量:6507 次
发布时间:2019-06-24

本文共 3646 字,大约阅读时间需要 12 分钟。

原文:

一. 字符合并

if OBJECT_ID('ConcatStr') is not nulldrop table ConcatStrGOcreate table ConcatStr(ID int,Code varchar(10))GOinsert into ConcatStrselect 1,'XXX' union allselect 1,'YYY' union allselect 2,'PPP' union allselect 2,'QQQ'

 要得到这样的结果:

ID Code
1 XXX,YYY
2 PPP,QQQ

1. 用游标

declare @t table(ID int, Code varchar(1000))declare @id intdeclare c cursor for select distinct ID from ConcatStropen cfetch next from c into @idwhile @@fetch_status=0begindeclare @str varchar(max)set @str = ''select @str = @str + ',' + Code from ConcatStr where ID = @idinsert into @t(ID, Code)select @id,stuff(@str,1,1,'')fetch next from c into @idendclose cdeallocate cselect * from @t

 2. 用自定义函数

跟游标的方法类似,只是把逐个取的动作封装到函数里去了。

(1) 函数方法1

if OBJECT_ID('f_concat_str') is not nulldrop function f_concat_strGOcreate function f_concat_str(@id int)returns nvarchar(4000)asbegindeclare @s nvarchar(4000)set @s=''select @s = @s+',' + Code from ConcatStr where ID = @idreturn (stuff(@s,1,1,''))--return (right(@s,len(@s)-1)) End

 (2) 函数方法2,就是把函数1再简化

if OBJECT_ID('f_concat_str') is not nulldrop function f_concat_strGOcreate function f_concat_str(@id int)returns nvarchar(4000)asbegindeclare @s nvarchar(4000)--set @s=''--select @s = case when @s = '' then Code else @s + ',' + Code end--from ConcatStr where ID = @idselect @s = isnull(@s + ',','') + Code from ConcatStr where ID = @idreturn @send

 调用函数1或者函数2

--select ID,dbo.f_concat_str(ID) as Code--from ConcatStr --group by IDSelect distinct ID, Code = dbo.f_concat_str(ID) from ConcatStr

 3. 利用静态的行列转换写法

给分组里的每行构造一个编号,行列转换后把列连接起来,编号多少个,取决于每个分组COUNT(1)的值。

SELECT ID,       MAX(CASE WHEN num = 1 THEN Code ELSE '' END)     + MAX(CASE WHEN num = 2 THEN ',' + Code ELSE '' END) AS CodeFROM (SELECT ID, Code,      (SELECT COUNT(*)         FROM dbo.ConcatStr AS t2        WHERE t2.ID = t1.ID          AND t2.Code <= t1.Code) AS numFROM dbo.ConcatStr AS t1) AS tGROUP BY ID;

 4. 用FOR XML子句

(1) FOR XML AUTO

SQL Server 2000就有这个子句,不过OUTER APPLY是SQL Server 2005的语法。通常这种写法效率上不会比用函数快。

SELECT * FROM(SELECT DISTINCT ID FROM ConcatStr)A OUTER APPLY(SELECT Code= STUFF(REPLACE(REPLACE((SELECT Code FROM ConcatStr N WHERE ID = A.ID FOR XML AUTO), '
', ''), 1, 1, ''))N

 (2) FOR XML PATH

SQL Server 2005的新语法。

SELECT ID,STUFF((SELECT ',' + CodeFROM dbo.ConcatStr AS t2WHERE t2.ID = t1.IDORDER BY IDFOR XML PATH('')), 1, 1, '') AS CodeFROM dbo.ConcatStr AS t1GROUP BY ID;

 

二. 字符拆分

if not object_id('SplitStr') is nulldrop table SplitStrGocreate table SplitStr(Col1 int,Col2 nvarchar(10))insert SplitStrselect 1,N'a,b,c' union allselect 2,N'd,e' union allselect 3,N'f'Go

 要得到这样的结果:

Col1 Code
1 a
1 b
1 c
2 d
2 e
3 f

1. 使用数字辅助表

if object_id('Tempdb..#Num') is not nulldrop table #NumGOselect top 100 ID = Identity(int,1,1) into #Num --也可用ROW_NUMBER()来生成from syscolumns a,syscolumns bGOSelect a.Col1,Col2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID) from SplitStr a,#Num bwhere charindex(',',','+a.Col2,b.ID)=b.ID --也可用substring(','+a.COl2,b.ID,1)=','

 2. 使用CTE

with t(Col1, p1, p2)as(select Col1, charindex(',',','+col2), charindex(',',Col2+',') + 1 from SplitStrunion allselect s.Col1, t.p2, charindex(',', s.Col2+',', t.p2) + 1 from SplitStr s join t on s.Col1 = t.Col1 where charindex(',', s.Col2+',', t.p2) > 0)--select * from tselect s.Col1, Col2 = substring(s.Col2+',', t.p1, t.p2-t.p1-1) from SplitStr s join t on s.Col1 = t.Col1 order by s.Col1option (maxrecursion 0)

 3. 使用XML

SELECT A.Col1, B.CodeFROM(SELECT Col1, Code = CONVERT(XML,'
' + REPLACE(Col2, ',', '
') + '
') FROM SplitStr) AOUTER APPLY(SELECT Code = N.v.value('.', 'varchar(100)') FROM A.Code.nodes('/root/v') N(v)) B

  

转载地址:http://cbwfo.baihongyu.com/

你可能感兴趣的文章
webpack入门(二)what is webpack
查看>>
学习C语言必须知道的理论知识(第一章)
查看>>
眠眠interview Question
查看>>
[转]CSS hack大全&详解
查看>>
RPC-client异步收发核心细节?
查看>>
#define WIN32_LEAN_AND_MEAN 的作用
查看>>
仿余额宝数字跳动效果 TextCounter
查看>>
你必须知道的.net学习总结
查看>>
Axure8.0 网页 or App 鼠标滚动效果
查看>>
大家好,新年快乐。
查看>>
Android学习路线
查看>>
Linux下的redis的持久化,主从同步及哨兵
查看>>
在相同的主机上创建一个duplicate数据库
查看>>
Date15
查看>>
从Date类型转为中文字符串
查看>>
基于multisim的fm调制解调_苹果开始自研蜂窝网调制解调器 最快2024年能用上?
查看>>
mupdf不支持x64_Window权限维持(七):安全支持提供者
查看>>
labview如何弹出提示窗口_LabVIEW开发者必读的问答汇总,搞定疑难杂症全靠它了!...
查看>>
hikariconfig mysql_HikariConfig配置解析
查看>>
mysql批量数据多次查询数据库_mysql数据库批量操作
查看>>