入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

查询结果集合成一列的sqlserver实现方法stuff

创建时间:2016-06-28 投稿人: 浏览次数:1700

我有个需求如下图

表的结构关系


网上找了一下资料,发现可以用stuff+for xml path("")

for xml path("")的作用是将字符串先拼成一个

 SELECT
		*,
		RLCD = (select "," + RLCD from WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD for xml path("")),
		RLNM=(select "," + RLNM from WQ_ROLE_B WHERE RLCD IN(SELECT RLCD FROM WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD) for xml path("")) 
	FROM
		WQ_USER_B

得到的结果如下,但出现一个小问题,就是前面会多出一个","号,如下图


这时,可以用stuff()去除逗号

关于STUFF的介绍
STUFF ( character_expression , start , length ,character_expression )
参数
character_expression
一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。

start
一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。

length
一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。

返回类型
如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。


备注
如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。
如果结果值大于返回类型支持的最大值,则产生错误。

我只要把第一个字符串改成空字符串就可以了,代码如下

 SELECT
		*,
		RLCD = (select "," + RLCD from WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD for xml path("")),
		RLNM=stuff((select "," + RLNM from WQ_ROLE_B WHERE RLCD IN(SELECT RLCD FROM WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD) for xml path("")) , 1 , 1 , "")
	FROM
		WQ_USER_B

这样就得到了我想要的结果,大功告成

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。