04. 字符串合并与拆分写法小结
原文:04. 字符串合并与拆分写法小结

一. 字符合并

if OBJECT_ID('ConcatStr') is not null
drop table ConcatStr
GO
create table ConcatStr
(
ID int,
Code varchar(10)
)
GO
insert into ConcatStr
select 1,'XXX' union all
select 1,'YYY' union all
select 2,'PPP' union all
select 2,'QQQ'

要得到这样的结果:

ID Code
1 XXX,YYY
2 PPP,QQQ

1. 用游标

declare @t table(ID int, Code varchar(1000))
declare @id int
declare c cursor for
select distinct ID from ConcatStr
open c
fetch next from c into @id
while @@fetch_status=0
begin
declare @str varchar(max)
set @str = ''
select @str = @str + ',' + Code from ConcatStr where ID = @id
insert into @t(ID, Code)
select @id,stuff(@str,1,1,'')
fetch next from c into @id
end
close c
deallocate c
select * from @t

2. 用自定义函数

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

if OBJECT_ID('f_concat_str') is not null
drop function f_concat_str
GO
create function f_concat_str(@id int)
returns nvarchar(4000)
as
begin
declare @s nvarchar(4000)
set @s=''
select @s = @s+',' + Code from ConcatStr where ID = @id
return (stuff(@s,1,1,''))
--return (right(@s,len(@s)-1))
End

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

if OBJECT_ID('f_concat_str') is not null
drop function f_concat_str
GO
create function f_concat_str(@id int)
returns nvarchar(4000)
as
begin
declare @s nvarchar(4000)
--set @s=''
--select @s = case when @s = '' then Code else @s + ',' + Code end
--from ConcatStr where ID = @id
select @s = isnull(@s + ',','') + Code from ConcatStr where ID = @id
return @s
end

调用函数1或者函数2

--select ID,dbo.f_concat_str(ID) as Code
--from ConcatStr
--group by ID
Select 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 Code
FROM (SELECT ID, Code,(SELECT COUNT(*)
         FROM dbo.ConcatStr AS t2
        WHERE t2.ID = t1.ID
          AND t2.Code <= t1.Code) AS num
FROM dbo.ConcatStr AS t1) AS t
GROUP 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), '<N Code="', ','), '"/>', ''), 1, 1, ''))N

(2) FOR XML PATH

SQL Server 2005的新语法。

SELECT ID,
STUFF((SELECT ',' + Code
FROM dbo.ConcatStr AS t2
WHERE t2.ID = t1.ID
ORDER BY ID
FOR XML PATH('')), 1, 1, '') AS Code
FROM dbo.ConcatStr AS t1
GROUP BY ID;

二. 字符拆分

if not object_id('SplitStr') is null
drop table SplitStr
Go
create table SplitStr
(
Col1 int,
Col2 nvarchar(10)
)
insert SplitStr
select 1,N'a,b,c' union all
select 2,N'd,e' union all
select 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 null
drop table #Num
GO
select top 100 ID = Identity(int,1,1) into #Num
--也可用ROW_NUMBER()来生成
from syscolumns a,syscolumns b
GO
Select a.Col1,Col2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID)
from SplitStr a,#Num b
where 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 SplitStr
union all
select 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 t
select 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.Col1
option (maxrecursion 0)

3. 使用XML

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

posted on 2014-09-06 11:21 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3959244.html

04. 字符串合并与拆分写法小结相关推荐

  1. python字典合并输入用字符_左右用R右手Python9——字符串合并与拆分

    原标题:左右用R右手Python9--字符串合并与拆分 杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化.个人公众号:数 ...

  2. MySQL字符串的合并及拆分

    按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符).本文将举例演示如何进行按照指定字符合并及拆分. 01 合并 M ...

  3. php拆分excel,PHP_PHPExcel合并与拆分单元格的方法,本文实例讲述了PHPExcel合并与 - phpStudy...

    PHPExcel合并与拆分单元格的方法 本文实例讲述了PHPExcel合并与拆分单元格的方法.分享给大家供大家参考,具体如下: $objPHPExcel; $filepath="c:\tem ...

  4. ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map

    根据视频进行整理 [https://www.bilibili.com/video/BV1uK411H7on?p=1] 视频资源(百度网盘): 链接:[https://pan.baidu.com/s/1 ...

  5. mysql按指定长度拆分_MySQL按指定字符合并及拆分

    按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符).本文将举例演示如何进行按照指定字符合并及拆分. 1. 合并 M ...

  6. mysql多行合并成一行_数据文件合并与拆分

    [摘要] 本文介绍将多个文本文件和 Excel 文件合并成一个文件,或者将一个文件拆分成几个小文件时,如何处理会遇到的几种情况,并用 esProc SPL 举例实现. 在数据处理业务中,经常要把文件结 ...

  7. access 合并多行字符串_八种方法玩转字符串合并,这篇文章全都给你讲明白!...

    在日常工作过程中,经常会遇到要把一串字符拼接到一起的情况. 你是不是还一直在用"&"连接符来合并字符串呢?当遇到很多个字符串需要合并的时候,这种方法又费时又费力,那有没有其 ...

  8. 【转载】配置文件 .yml 写法小结

    配置文件 .yml 写法小结 原文链接:https://www.jianshu.com/p/a8252bf2a63d yaml 是什么? 在 github 一些开源项目里经常可以看到 .travis. ...

  9. python怎么拆分没有分隔符字符串_python如何拆分含有多种分隔符的字符串

    案例: 把某个字符串依据分隔符拆分,该字符包含不同的多种分隔符,如下 s = '12;;7.osjd;.jshdjdknx+' 其中 ; . + 是分隔符 有哪些解决方案? 方法1:通过str.spl ...

最新文章

  1. 正则表达式限制输入整数或小数
  2. 推荐系统超级公开课报名!
  3. JDK1.5 新特性
  4. jQuery 元素操作——遍历元素
  5. Blue-Red Permutation 贪心,思维
  6. 来和 webpack 谈场恋爱吧!这课程好甜!
  7. [编程启蒙游戏] 1. 猜数字
  8. java类型提升_java表达式中类型的自动提升(转)
  9. [转]将微信和支付宝支付的个二维码合二为一
  10. 金庸群侠传 3小时爆机
  11. AWD:赛前准备工作以及深度脚本讲解
  12. 常见js针对浏览器之间的兼容问题
  13. 算法题目打卡:Ques20201012
  14. 谷歌访问英文网站翻译为中文
  15. Error:(292, 40) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) ........
  16. SQL查询左连接、右连接、内连接
  17. 抖音常见的违规封号行为;怎么避免抖音违规;丨国仁网络资讯
  18. input的disabled属性
  19. 未来科学技十幻想画计算机,未来世界科幻画图片 你憧憬过这样的未来吗
  20. 【PhD Debate —11】矛与盾的对决——神经网络后门攻防

热门文章

  1. 前端获取不到后台传过去的headers信息解决办法
  2. 查找nginx安装的路径以及相关安装操作命令
  3. PYthon3:函数实现“自动售卖机”功能
  4. hdu 4336 Card Collector
  5. iOS Xcode8的适配
  6. Mercurial入门学习
  7. 天啊!我的xbox360突然不读盘了。。。
  8. 转载自csdn SQL SERVER 与ACCESS、EXCEL的数据转换
  9. 《Effective C#》某些地方实在是对不起Effective这个词(I)
  10. tapable源码分析