简介

group_concat是MySQL数据库的一个函数,作用就是将查询到的某列数据合并成一行(既字符串),待会演示一下这个函数。
其实,很多业务场景会用到这个功能,但是在sqlservre数据库中没有这样的函数,只能自己实现。
在正文之前推荐一个在线sql运行网站---- http://sqlfiddle.com/

详解

MySql--group_concat函数

话不多说,直接上图!!!
123.png
456.png

SqlServer实现

使用 FOR XML PATH ,其作用是将查询结果集以XML形式展现,将多行的结果,展示在同一行。
FOR XML PATHFOR XML 的其一子句,有兴趣可以百度了解一下,技多不压身嘛。
继续直接上图!!!
789.png
147.png
依旧和MySQL的group_concat函数有些差别,可以使用SqlServre数据库的stuff函数解决。

SqlServer--stuff

STUFF函数的作用是将字符串插入到另一个字符串中。语法:
STUFF(character_expression , start , length , replaceWith_expression)

character_expression字符数据的表达式,可以是常量、变量,也可以是字符列或二进制数据列
start一个整数值(从1开始),指定删除和插入的开始位置。start的类型可以是bigint。如果 start 为负或为零,则返回空字符串。如果 start 的长度大于第一个 character_expression,则返回空字符串。
length一个整数,指定要删除的字符数。length的类型可以是 bigint。如果 length 为负,则返回空字符串。如果 length 的长度大于character_expression,则最多可以删除到character_expression 中的最后一个字符。如果 length 为零,则不删除字符直接在指定位置插入内容。
replaceWith_expression字符数据的表达式,可以是常量、变量,也可以是字符列或二进制数据列。此表达式从 start 开始替换 length 个字符的character_expression。

解决FOR XML PATH 逗号问题

258.png
369.png
第一个是stuff函数的执行效果。
第二个是我错误的使用效果,可以知道 FOR XML PATH 的执行优先级是较低的,是先查询然后再xml拼接。
第三个是正确的使用效果。要把逗号放前面,因为无法获取到返回的字符串长度(也可能是我知识尚浅,有大神有办法获取到长度可以评论分享一下),这也是不用substring、left、right等截取字符串函数的原因。

结束语

今日学习,又发现一点
数据库的字符串的下表不是从 0 开始,而是从 1 开始。SqlServer和Mysql都是,其他未了解。
感兴趣的小伙伴可以封装成一个函数使用,用函数来实现这个功能应该还有其他方式。研究研究,过两天补充这个博客。
一直在学习的路上,从未停止脚步!!!