sqlserver 把SELECT结果集中一列的所有的值 用逗号隔开放进一个字段内

Posted 剑来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 把SELECT结果集中一列的所有的值 用逗号隔开放进一个字段内相关的知识,希望对你有一定的参考价值。

首先我们有一个表 查询结果如下:

现在我们想要把USER_NAME这一列的内容 放到一个字段里面去:

一行sql语句解决问题:

SELECT  STUFF(( SELECT  \',\' +convert(VARCHAR, USER_NAME) FROM TE_USER FOR XML PATH(\'\')), 1, 1, \'\') AS UserName

 

解释一下上面这条语句:

1,首先STUFF函数在上面的语句里的作用是去除拼接的字符串最前面的逗号

STUFF函数的用法大概是STUFF(param1, startIndex, length, param2)  意思是将param1中自startIndex(SQL中都是从1开始  而非0)起 删除length个字符  然后用param2替换删掉的字符  具体用法请自行百度

2,重点说一下 FOR XML PATH:

执行SELECT * FROM TE_USER FOR XML PATH语句得到的结果:

<row>
  <USER_ID>1</USER_ID>
  <USER_NAME>张三</USER_NAME>
  <USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
</row>
<row>
  <USER_ID>2</USER_ID>
  <USER_NAME>李四</USER_NAME>
  <USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
</row>
<row>
  <USER_ID>3</USER_ID>
  <USER_NAME>王五</USER_NAME>
  <USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
</row>

看得出来 是把sql执行的结果转换成xml格式了

 

我们再来执行一下下面这条sql    SELECT * FROM TE_USER FOR XML PATH(\'ABC\')

<ABC>
  <USER_ID>1</USER_ID>
  <USER_NAME>张三</USER_NAME>
  <USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
</ABC>
<ABC>
  <USER_ID>2</USER_ID>
  <USER_NAME>李四</USER_NAME>
  <USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
</ABC>
<ABC>
  <USER_ID>3</USER_ID>
  <USER_NAME>王五</USER_NAME>
  <USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
</ABC>

发现xml的row节点变成我们自定义的ABC了  那么我们如果用 FOR XML PATH(\'\') 就代表把节点变为空了:

<USER_ID>1</USER_ID>
<USER_NAME>张三</USER_NAME>
<USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
<USER_ID>2</USER_ID>
<USER_NAME>李四</USER_NAME>
<USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>
<USER_ID>3</USER_ID>
<USER_NAME>王五</USER_NAME>
<USER_PASSWORD>c4ca4238a0b923820dcc509a6f75849b</USER_PASSWORD>

把节点变空了以后 我们执行SELECT  \',\' +convert(VARCHAR, USER_NAME) FROM  TE_USER FOR XML PATH(\'\') 语句  结果:    

,张三,李四,王五 

这就实现了USER_NAME这一列的值取出来拼接到一起了  再用我们上面说的STUFF函数把最前面的逗号去掉 就可以了。

以上。

 

以上是关于sqlserver 把SELECT结果集中一列的所有的值 用逗号隔开放进一个字段内的主要内容,如果未能解决你的问题,请参考以下文章

用于计算运行平均列的 SQL Select 语句

在SqlServer2008R2中,根据分隔符把一列的值切割成多列

如何在修剪其中一列的结果时选择所有列?

SELECT 赋值:怎么把一列的数据赋值给一个变量

sql 插入列放第一列

SqlServer查询 SELECT 赋值