SQL SERVER 多行合并一行

原创  郑建华   2019-12-12   193人阅读  2 条评论
摘要:

一、用法:STUFF函数:a.作用stuff(param1, startIndex, length, param2)将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。b.参数param1一个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。startIndex一个整数值,指定删除和插入的开始位置。如果 startIndex或 length 为负,则返回空字符串。如果startIndex比p

一、用法:

STUFF函数:

a.作用

stuff(param1, startIndex, length, param2)
将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。

b.参数

param1
一个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。
startIndex
一个整数值,指定删除和插入的开始位置。如果 startIndex或 length 为负,则返回空字符串。如果startIndex比param1长,则返回空字符串。startIndex可以是 bigint 类型。
length
一个整数,指定要删除的字符数。如果 length 比param1长,则最多删除到param1 中的最后一个字符。length 可以是 bigint 类型。

c.返回类型

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

d.备注

如果结果值大于返回类型支持的最大值,则产生错误。

FOR XML PATH  将查询结果集以XML形式展现

select  stuff((select ',' + CAST(id as varchar(4))   from org_structure where pid = cte.id for xml path('')), 1, 1, '') as childids,cte.name from  cte

二、示例:

with class as 
(
	select v.id,
				v.name as classes_name,
				inf.font_color as classes_font_color 
		from scheduling_classes_version v left join	scheduling_classes_info inf on v.class_id=inf.id
) 
select a.id,
			a.user_code,
			a.work_date,
			a.classes_version_id,
			stuff(
				(select ',' + CAST(class.classes_name as varchar(100))  from class where class.id
						in (select * from Fun_SplitStr(a.classes_version_id,','))
						for xml path('')
				), 1, 1, ''
			) as classes_name,
			stuff(
				(select ',' + CAST(class.classes_font_color as varchar(100))  from class where class.id
						in (select * from Fun_SplitStr(a.classes_version_id,','))
						for xml path('')
				), 1, 1, ''
			) as classes_font_color
from scheduling_info a

image.png

三、参考: https://www.cnblogs.com/hendrix/p/11012772.html

本文地址:https://www.zjh336.cn/?id=79
版权声明:本文为原创文章,版权归 郑建华 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

 评论列表

  1. 夏日博客
    夏日博客 【村长】  @回复

    sql server很长时间不使用了,都陌生了。