sqlserver oracle 字符串拼接
时间:2021-07-01 10:21:17
帮助过:2人阅读
table tb (
[id] int,
[name] varchar(
2))
insert into tb
select 1,
‘aa‘ union all
select 2,
‘bb‘ union all
select 1,
‘cc‘ union all
select 3,
‘dd‘ union all
select 2,
‘ee‘
select * from tb
--查询
select
id,
name=stuff((
select ‘,‘+name
from tb
where id
=t.id
for xml path(
‘‘)),
1,
1,
‘‘)
from
tb t
group by
id
方法二:
CREATE FUNCTION GET_STRING(
@ID INT)
RETURNS VARCHAR(
50)
AS
BEGIN
DECLARE @NAME VARCHAR(
500)
SELECT @NAME=ISNULL(
@NAME+‘,‘,
‘‘)
+NAME
FROM TB
WHERE ID
=@ID
RETURN @NAME
END
SELECT ID ,DBO.GET_STRING(ID)NAME
FROM TB
GROUP BY ID
-----------------------------------------------------------------------
在oracle中,是有相对应的函数,sys_connect_by_path函数。
先在这里把oracle的函数实现也写下吧
select id
,itrim(max(sys_connect_by_path(name,
‘,‘)))
as name
from
(select id
,name
,lead(rnFirst) over(partition
by no
order by rnFirst)rnNext
from
(select a.id
,a.name
,row_number() over(
order by a.id,a.name
desc) rnFirst
from @t a) tmpTable1
) tmpTable2
start with rnNext
is null
connect by rnNext
= PRior rnFirst
group by id
以上是实现oracle中的行转列方式。
********************************************下面我们来看一下sqlserver的,因为sqlserver没提供类似的函数,不知道sqlserver2012提供没
不过sqlserver支持起来也很简单,使用cross apply和for xml path组合来用,这两个单独都知道是怎么回事,怎么使用,但是真不知道还有它俩组合来完成这个功能的,感到很是不可思议,这里要感谢下网络上的人,原来自己写东西都是把所学到的知识记录到本机,从不放到网上,也可能是最近吧,好多工作不会,都是通过网络帮助,就把我所知道的东西也都放到网上来,大家一起学习。
sqlserver:
select id,
SUBSTRING(names,
1,
len(names)
-1)
from @t AS A
cross APPLY
(SELECT NAME
+ ‘,‘ FROM @t AS B
WHERE A.id
= B.id
FOR XML PATH(
‘‘)) D (names)
GROUP BY id, names
1 aa,cc
2 bb,ee
3 dd
sqlserver实测有效
以上内容转自
http://new-fighter.iteye.com/blog/1537533
sqlserver oracle 字符串拼接
标签: