SQL进行字符的拼接与拆分

1.在处理数据查询时,有时需要将多行数据合并到一行里,或者将一行里的数据拆分处理,下面来看看例子:

如你有一组数据:

 ID         name

1212     大西装

1212     小西装

我们需要将结果显示为:

  ID             name

1212         大西装,小西装

创建测试数据:

select * from #2
DROP TABLE #2
create table #2
(id int,
 name nvarchar(max))
insert into #2
select 1212,N'小西装' union all

select 1212,N'大西装'

实现方法:

select id,

(STUFF((select ','+name from #2 a where a.id=b.id for xml path ('')),1,1,''))as name

 from #2 b

 group by id

备注:

1、计算列可以不用包含在聚合函数中而直接显示,如下面语句的val。
2、for xml path('') 应该应用于语句的最后面,继而生成xml。
3、for xml path('root')中的path参数是生成的xml最顶级节点。
4、字段名或是别名将成为xml的子节点,对于没有列名(字段+'')或是没有别名的字段将直接显示。如[value] +','则是用,分隔的数据(aa,bb,)。
5、对于合并多行数据显示为一行数据时使用自连。
 STUFF:是删除指定长度的字符,并在指定的起点处插入另一组字符
语法:
STUFF ( character_expression , start , length ,character_expression )
如:SELECT STUFF('abcdef', 2, 3, 'ijklmn')
  下面是结果集   :aijklmnef


以上实现了并接的效果,但如果你本身的数值就是并接的,如何拆分呢?

创建测试数据:

create table #2(id int,name Nvarchar(100))
insert into #2 values(1212,N'小西装,大西装')

实现代码:

SELECT A.id, B.name
FROM(
    SELECT id, [name] = CONVERT(xml,' ' + REPLACE([name], ',', ' ') + ' ') FROM #2
)A
OUTER APPLY(
    SELECT name = N.v.value('.', 'varchar(100)') FROM A.[name].nodes('/root/v') N(v)
)B

 结果集:

ID              name

1212           大西装

1212           小西装

 

 

 

你可能感兴趣的:(SQL,Server)