SQL SERVER中字符串的合并与拆分

 

  
  
  
  
  1. --合并分拆表  
  2. /******************************************************************************************************************************************************  
  3. 合并分拆表数据  
  4.  
  5. 整理人:中国风(Roy)  
  6.  
  7. 日期:2008.06.06  
  8. ******************************************************************************************************************************************************/  
  9.  
  10. --> --> (Roy)生成�y����  
  11.    
  12. if not object_id('Tab'is null 
  13.     drop table Tab  
  14. Go  
  15. Create table Tab([Col1] int,[Col2] nvarchar(1))  
  16. Insert Tab  
  17. select 1,N'a' union all 
  18. select 1,N'b' union all 
  19. select 1,N'c' union all 
  20. select 2,N'd' union all 
  21. select 2,N'e' union all 
  22. select 3,N'f' 
  23. Go  
  24.  
  25. 合并表:  
  26.  
  27. SQL2000用函数:  
  28.  
  29. go  
  30. if object_id('F_Str'is not null 
  31.     drop function F_Str  
  32. go  
  33. create function F_Str(@Col1 int)  
  34. returns nvarchar(100)  
  35. as 
  36. begin 
  37.     declare @S nvarchar(100)  
  38.     select @S=isnull(@S+',','')+Col2 from Tab where Col1=@Col1  
  39.     return @S  
  40. end 
  41. go  
  42. Select distinct Col1,Col2=dbo.F_Str(Col1) from Tab  
  43.  
  44. go  
  45.  
  46. SQL2005用XML:  
  47.  
  48. 方法1:  
  49.  
  50. select   
  51.     a.Col1,Col2=stuff(b.Col2.value('/R[1]','nvarchar(max)'),1,1,'')  
  52. from   
  53.     (select distinct COl1 from Tab) a  
  54. Cross apply  
  55.     (select COl2=(select N','+Col2 from Tab where Col1=a.COl1 For XML PATH(''), ROOT('R'), TYPE))b  
  56.  
  57. 方法2:  
  58.  
  59. select   
  60.     a.Col1,COl2=replace(b.Col2.value('/Tab[1]','nvarchar(max)'),char(44)+char(32),char(44))  
  61. from   
  62.     (select distinct COl1 from Tab) a  
  63. cross apply  
  64.     (select Col2=(select COl2 from Tab  where COl1=a.COl1 FOR XML AUTO, TYPE)  
  65.                 .query('<Tab>  
  66.                 {for $i in /Tab[position()<last()]/@COl2 return concat(string($i),",")}  
  67.                 {concat("",string(/Tab[last()]/@COl2))}  
  68.                 </Tab>')  
  69.                 )b  
  70.  
  71. SQL05用CTE:  
  72.  
  73. ;with roy as(select Col1,Col2,row=row_number()over(partition by COl1 order by COl1) from Tab)  
  74. ,Roy2 as 
  75. (select COl1,cast(COl2 as nvarchar(100))COl2,row from Roy where row=1   
  76. union all   
  77. select a.Col1,cast(b.COl2+','+a.COl2 as nvarchar(100)),a.row from Roy a join Roy2 b on a.COl1=b.COl1 and a.row=b.row+1)  
  78. select Col1,Col2 from Roy2 a where row=(select max(row) from roy where Col1=a.COl1) order by Col1 option (MAXRECURSION 0)  
  79.  
  80.  
  81. 生成结果:  
  82. /*  
  83. Col1        COl2  
  84. ----------- ------------  
  85. 1           a,b,c  
  86. 2           d,e  
  87. 3           f  
  88.  
  89. (3 行受影响)  
  90. */  
  91.  
  92.  
  93. 拆分表:  
  94.  
  95. --> --> (Roy)生成�y����  
  96.    
  97. if not object_id('Tab'is null 
  98.     drop table Tab  
  99. Go  
  100. Create table Tab([Col1] int,[COl2] nvarchar(5))  
  101. Insert Tab  
  102. select 1,N'a,b,c' union all 
  103. select 2,N'd,e' union all 
  104. select 3,N'f' 
  105. Go  
  106.  
  107. SQL2000用辅助表:  
  108. if object_id('Tempdb..#Num'is not null 
  109.     drop table #Num  
  110. go  
  111. select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b  
  112. Select   
  113.     a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID)   
  114. from   
  115.     Tab a,#Num b  
  116. where 
  117.     charindex(',',','+a.Col2,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=','  
  118.  
  119.  
  120. SQL2005用Xml:  
  121.  
  122. select   
  123.     a.COl1,b.Col2  
  124. from   
  125.     (select Col1,COl2=convert(xml,'<root><v>'+replace(COl2,',','</v><v>')+'</v></root>'from Tab)a  
  126. outer apply  
  127.     (select Col2=C.v.value('.','nvarchar(100)'from a.COl2.nodes('/root/v')C(v))b  
  128.  
  129.  
  130.  
  131.  
  132. SQL05用CTE:  
  133.  
  134. ;with roy as   
  135. (select Col1,COl2=cast(left(Col2,charindex(',',Col2+',')-1) as nvarchar(100)),Split=cast(stuff(COl2+',',1,charindex(',',Col2+','),''as nvarchar(100)) from Tab  
  136. union all 
  137. select Col1,COl2=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),''as nvarchar(100)) from Roy where split>'' 
  138. )  
  139. select COl1,COl2 from roy order by COl1 option (MAXRECURSION 0)  
  140.  
  141. 生成结果:  
  142. /*  
  143. Col1        COl2  
  144. ----------- -----  
  145. 1           a  
  146. 1           b  
  147. 1           c  
  148. 2           d  
  149. 2           e  
  150. 3           f  
  151. */ 

转自CSDN.net

你可能感兴趣的:(sql,数据库,字符串,职场,休闲,合并拆分)