zoukankan      html  css  js  c++  java
  • 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函数把最前面的逗号去掉 就可以了。

    以上。

  • 相关阅读:
    poj 2417 Discrete Logging
    洛谷 P2886 [USACO07NOV]牛继电器Cow Relays
    bzoj 3232 圈地游戏——0/1分数规划(或网络流)
    bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划
    bzoj 5281 [Usaco2018 Open]Talent Show——0/1分数规划
    CF 949D Curfew——贪心(思路!!!)
    bzoj 3872 [Poi2014]Ant colony——二分答案
    bzoj 1731 [Usaco2005 dec]Layout 排队布局——差分约束
    洛谷 1344 [USACO4.4]追查坏牛奶Pollutant Control——最大流
    洛谷 1262 间谍网络——缩点+拓扑
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/7359575.html
Copyright © 2011-2022 走看看