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

  

时间: 2024-09-24 22:00:59

04. 字符串合并与拆分写法小结的相关文章

PHPExcel合并与拆分单元格的方法_php技巧

本文实例讲述了PHPExcel合并与拆分单元格的方法.分享给大家供大家参考,具体如下: $objPHPExcel; $filepath="c:\temp.xlsx"; try { $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader->load($filepath); } catch (Exception $e) { die(); } $column_index

Excel 2007单元格及内容的合并、拆分

Excel 2007的合并与拆分操作包括对单元格与单元格内容的合并与拆分. 合并单元格或拆分合并的单元格 当您合并两个或多个相邻的水平或垂直单元格时,这些单元格就成为一个跨多列或多行显示的大单元格.其中一个单元格的内容出现在合并的单元格 (合并单元格:由两个或多个选定单元格创建的单个单元格.合并单元格的单元格引用是原始选定区域的左上角单元格.)的中心,如以下示例所示. 可以将合并的单元格重新拆分成多个单元格,但是不能拆分未合并过的单元格.   合并相邻单元格 1.选择两个或更多要合并的相邻单元格

php数组合并与拆分实例分析

 本文实例讲述了php数组合并与拆分的方法.分享给大家供大家参考.具体如下: 1 2 3 4 5 6 7 8 <?php $array1 = array("A","B","C","D"); $array2 = array("1","2","3","4"); $array3 = array("!","@"

WPS文字中对表格进行合并或拆分的技巧

  在WPS文字中插入并编写了表格后,发现有些内容是可以整合在一起,看起来也更加整齐,那么就要对表格进行合并和拆分.下面小编就向大家介绍下在WPS文字中对表格进行合并和拆分的好方法. 一.合并单元格 要将单元格1和单元格2进行合并,选择"表格工具"-"合并单元格". 合并单元格 二.拆分单元格 要将单元格1.2进行拆分,选择"表格工具"-"拆分单元格".在弹出的拆分单元格窗口中根据拆分要求填写单元格要拆分为的行和列. 以上就是

wps文字中如何合并和拆分单元格

  WPS文字中表格的合并和拆分也是相对比较基础的技巧,下面就一个3行5列的表格,通过单元格1和单元格2进行合并和拆分. 一.合并单元格 要将单元格1和单元格2进行合并,选择"表格工具"-"合并单元格",如图1所示.合并效果如图2. 图1 图2 二.拆分单元格 要将单元格1.2进行拆分,选择"表格工具"-"拆分单元格",如图3所示.在弹出的拆分单元格窗口中根据拆分要求填写单元格要拆分为的行和列,如图4所示.拆分效果如图5. 图

Word2010怎么合并和拆分单元格

  其实合并和拆分是两个相反的概念.合并是将两个或者是两个以上的单元格整合成一个单元格,而拆分是将一个单元格,拆成两个或者两个以上的单元格.如果要绘制比较复杂的表格,我们一定要掌握合并和拆分单元格的方法. Word2010 合并单元格方法: 方法一: 打开Word2010文档页面,选择表格中需要合并的两个或两个以上的单元格. 右键单击被选中的单元格,选择"合并单元格"菜单命令即可. 方法二: 打开Word2010文档,选择表格中需要合并的两个或两个以上的单元格. 单击"布局&

word2007中合并、拆分单元格

  在excel中,合并.拆分单元格是经常会用到的.而在word文档中,偶尔我们也需要插入表格,然后编辑表格,那么如何对word中的表格单元格进行合并.拆分呢? 一.如何在word中创建表格 1.选择"插入"选项卡,单击"表格"按钮,在弹出的列表框中选择"插入表格"命令. 2.在弹出的"插入表格"对话框中,对列数.行数进行设置,这里我们设置"列数"为"5","行数"为

03. 行列转换写法小结

原文:03. 行列转换写法小结 行列转换,通常有2种方法,一是CASE WHEN/UNION:一是PIVOT/UNPIVOT.对于行值或列数不固定的情况,需要用动态SQL. 一. 行转列 --drop table RowToCol create table RowToCol ( ID int, Code varchar(10), Value int ) Go insert RowToCol select 1,'Item1',1000 union all select 1,'Item2',1000

java定义二维数组的几种写法(小结)_java

如下所示: //定义二维数组写法1 class numthree { public static void main(String[] args) { float[][] numthree; //定义一个float类型的2维数组 numthree=new float[5][5]; //为它分配5行5列的空间大小 numthree[0][0]=1.1f; //通过下标索引去访问 1行1列=1.1 numthree[1][0]=1.2f; // 2行1列=1.2 numthree[2][0]=1.3