温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL Server怎么实现group_concat功能

发布时间:2022-08-26 14:07:37 来源:亿速云 阅读:679 作者:iii 栏目:开发技术

本篇内容主要讲解“SQL Server怎么实现group_concat功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL Server怎么实现group_concat功能”吧!

    一、实现

    #tmp表内容如下:

    SQL Server怎么实现group_concat功能

    实现group_concat的sql语句为:

    Select
      RegionID,
      STUFF(
           (
             SELECT ',' + T.c1
             FROM #tmp T
             WHERE A.regionid = T.regionid
             FOR XML PATH('')
           ), 1, 1, ''
         ) as group_concat 
    FROM #tmp A
    Group by  RegionID

    实现效果如下:

    SQL Server怎么实现group_concat功能

    二、原理分析

    2.1、FOR XML PATH的作用

    FOR XML PATH 的作用是将查询结果集以XML形式展现,将多行的结果,展示在同一行,例如:

    select c1 from #tmp where RegionID = 41653

    其结果集如下:

    SQL Server怎么实现group_concat功能

    select c1 from #tmp where RegionID = 41653 FOR XML PATH('')

    当sql语句加上 FOR XML PATH('') 后

    具体输出的字符如下:

    <c1>30.326809</c1><c1>30.327982</c1><c1>30.347933</c1><c1>30.388104</c1><c1>30.392830</c1><c1>30.367931</c1><c1>30.368052</c1><c1>30.367842</c1><c1>30.357318</c1><c1>30.357349</c1><c1>30.357349</c1>

    通过字符拼接后可以把xml信息清除,并以指定的字符进行分割:

    select ',' + c1 from #tmp where RegionID = 41653 FOR XML PATH('')

    此时已基本达到group_concat的效果,但第一个字符串有分隔符需要去掉。

    2.2、STUFF函数

    2.2.1、STUFF函数在本SQL的作用

    我们使用STUFF函数的目的是把第一个分隔符去掉。

    上图可以看到,STUFF函数把字符串“abcdefg”中的第一个字符“a”删除。

    使用该函数我们可以很轻松的把上图得到的结果集去掉第一个逗号分隔符

    2.2.2、STUFF函数语法

    STUFF函数的作用是将字符串插入到另一个字符串中。它从第一个字符串的开始位置删除指定长度的字符,然后将第二个字符串插入到第一个字符串的开始位置。其语法为:

    STUFF(character_expression , start , length , replaceWith_expression)

    character_expression:字符数据的表达式,可以是常量、变量,也可以是字符列或二进制数据列。

    start:一个整数值(从1开始),指定删除和插入的开始位置。start的类型可以是bigint。

      &bull; 如果 start 为负或为零,则返回空字符串。

      &bull; 如果 start 的长度大于第一个 character_expression,则返回空字符串。 

    length:一个整数,指定要删除的字符数。length的类型可以是 bigint。

      &bull; 如果 length 为负,则返回空字符串。

      &bull; 如果 length 的长度大于character_expression,则最多可以删除到character_expression 中的最后一个字符。

      &bull; 如果 length 为零,则不删除字符直接在指定位置插入内容。 

    replaceWith_expression:字符数据的表达式,可以是常量、变量,也可以是字符列或二进制数据列。此表达式从 start 开始替换 length 个字符的character_expression。

      &bull; 如果 replaceWith_expression 为 NULL,则在不插入任何内容的情况下删除字符。

    2.3、sql语分分析

    2.3.1、一个简单的group by
    Select RegionID 
    FROM #tmp A
    Group by RegionID

    这个sql各位看官都十分熟悉,已经没什么好说的了。

    2.3.2、在select语句后面加上子查询
    Select RegionID,
        (
          SELECT ',' + T.c1
          FROM #tmp T
          WHERE A.regionid = T.regionid
          FOR XML PATH('')
        ) 
    FROM #tmp A
    Group by RegionID

    在上述简单的group by语句基础上加入一个select里的子查询

    在该子查询中,当外层的group by返回结果集中的第一行RegionID为41653时,这个值被子查询的where条件所使用,相当于:

    SELECT ',' + T.c1
    FROM #tmp T
    WHERE T.regionid = 41653
    FOR XML PATH('')

    因为FOR XML PATH把多行记录打平成一条记录

    接着第group by返回结果集中的第二行45761传入该子查询,依次类似上面描述的执行,直到所有外层的值遍历完成。

    2.3.3、去掉子查询结果集的第一个分隔符
    Select
      RegionID,
      STUFF(
           (
             SELECT ',' + T.c1
             FROM #tmp T
             WHERE A.regionid = T.regionid
             FOR XML PATH('')
           ), 1, 1, ''
         ) as group_concat 
    FROM #tmp A
    Group by  RegionID

    利用STUFF函数,去掉了第一个逗号,完成了最终sql语句。

    到此,相信大家对“SQL Server怎么实现group_concat功能”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI