多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')

有这么一个表

create table tb(id int, value varchar(10))
insert into tb values(1, ‘aa‘)
insert into tb values(1, ‘bb‘)
insert into tb values(2, ‘aaa‘)
insert into tb values(2, ‘bbb‘)
insert into tb values(2, ‘ccc‘)
insert into tb values(3, ‘ddd‘)
insert into tb values(3, ‘fff‘) 

需求:把id为3所以数据转为1行。以|分隔

1.把id为3的数据转  xml

xml

 

select ‘|‘+(value) from tb

where id=3

for xml path(‘‘)

效果

for xml path(‘‘) 括号加东西。的话。类似<li></li>的标签

2. 去掉第一个  | 替换成空格

需要函数 Stuff,,   类似对字符串操作这样的函数还有 replace() right () left() substring() 看需求使用

STUFF 函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。

Transact-SQL 语法约定

语法

STUFF ( character_expression , start , length ,character_expression )

stuff((select ‘|‘+(value) from tb

where id=3

for xml path(‘‘)),1,1,‘‘)

这句无法单独运行

3.最终实现

select id ,value=stuff((select ‘|‘+(value) from tb
where id=3
for xml path(‘‘)),1,1,‘‘)  from tb where id=3 group by id

ps:去掉一个where 得到的结果是不一样的,不懂为何。group by id 有去重的效果

效果图。没有------------

在oracle 数据库中他也有自己的实现。觉得这些东西没有什么的。只要你有需求,必然有答案,只是你接触了没有而已。反正现在编程我们都是站在巨人的肩膀上了。

多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')

时间: 2024-12-24 09:56:16

多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')的相关文章

SQLServer中的cross apply和FOR XML PATH

参考: FOR XML PATH:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html cross apply:http://www.cnblogs.com/Leo_wl/archive/2013/04/02/2997012.html 应用: FOR XML PATH,可以在group by 语句中,合并非group字段,例如:查询每个学生对应的课程(多个课程使用逗号隔开) cross apply,可以查询A表的同时

sql server的for xml path与变通的行转列

SQL Server中有提供一个FOR XML PATH的子句(不知道能不能叫函数),用来将查询结果行输出成XML格式,我们可以通过这个语法做一些变通实现一些特定的功能,比如说行转列.要会变通的话,当然首先是要知道FOR XML PATH的语法. FOR XML PATH的简单语法 假设有一个hobby表(爱好),表中有两个字段,一个是hobbyID(爱好id),一个是hName(爱好名称). 这样,我们执行一条最简单的带FOR XML PATH子句的SQL语句,看看查询出来的结果. SELEC

MySQL 添加列, 修改列, 删除列

ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 修改列名MySQL: alter table bbb change nnnnn hh int; 修改列名SQLServer:exec sp_rename't_stude

mysql 加入列,改动列,删除列。

MySQL 加入列,改动列,删除列 ALTER TABLE:加入,改动,删除表的列,约束等表的定义. 查看列:desc 表名; 改动表名:alter table t_book rename to bbb; 加入列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 改动列名MySQL: alter table bbb change nnnnn hh int; 改动列名SQLServer:exec

mysql 加入?列,改动列,删除列。

MySQL 加入?列,改动列,删除列 ALTER TABLE:加入?,改动,删除表的列,约束等表的定义. 查看列:desc 表名; 改动表名:alter table t_book rename to bbb; 加入?列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 改动列名MySQL: alter table bbb change nnnnn hh int; 改动列名SQLServer:e

浅析SQL Server数据库中的伪列以及伪列的含义

SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个常识,对此不作具体详细阐述.这里主要是提到的RowId引起了一点思考.那么,这个RowId是个什么玩意?能不能更加直观一点来看看RowId的信息?代表什么含义?这个当然也是可以的.Oracle中的表中有一个伪列的概念,就是在查询表的时候加上select rowid,* from Table,会查询出

MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列

ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 修改列名MySQL: alter table bbb change nnnnn hh int; 修改列名SQLServer:exec sp_rename't_stude

MySQL 添加列,修改列,删除列

ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 修改列名MySQL: alter table bbb change nnnnn hh int; 修改列名SQLServer:exec sp_rename't_stude

Mysql 修改列,增加列,删除列常用指令

ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除列:alter table 表名 drop column 列名; 修改列名MySQL: alter table bbb change nnnnn hh int; 修改列名SQLServer:exec sp_rename't_stude