下面是两个查询,在尝试执行sql学习任务时,我尝试锻炼以下问题。
查询1-在sql中这叫什么? 我试图通过Web搜索用法示例,但不知道要搜索什么。
查询1和2给我相同的结果,不同吗? 执行计划看起来很相似,除了最后一个有一个额外的步骤: UDX成本为0%步骤
将行放入字符串中会首选哪个?
这是sql中将行放入一个字符串的唯一方法吗?
非常感谢。
-查询1
declare @string varchar(max)
select @string = coalesce(@string, '') + coalesce(col1, '')
from
(
select '1' as col1
Union
select '2' as col1
Union
select '3' as col1
Union
select '4' as col1
) x
select @string;
-查询2
with cte_string
as
(
select '1' as col1
union
select '2' as col1
Union
select '3' as col1
Union
select '4' as col1
)
select cast(col1 as nvarchar(1))
from cte_string
for xml path(''), type;
答案 0 :(得分:0)
您已经注意到,在SQL中有多种串联字符串的方法。我不确定这些使用的方法是否有特定的名称。我将其描述为“我正在使用...连接字符串”。
首选真的更取决于您的个人品味。例如,由于以下原因,即使比较慢,我的首选方法还是使用STRING_AGG。因此,请帮自己一个忙,并更新您的SQL Server。
使用COALESCE进行串联:
DECLARE @string VARCHAR(MAX)
SELECT @string = COALESCE(@string, '') + COALESCE([value], '')
FROM (
SELECT '1' AS [value]
UNION
SELECT '2'
) AS [t]
SELECT @string
使用FOR XML PATH进行串联:
DECLARE @string VARCHAR(MAX)
SELECT @string = (
SELECT '' + [value]
FROM (
SELECT '1' AS [value]
UNION
SELECT '2'
) AS [t]
FOR XML PATH(''))
SELECT @string
使用公用表表达式进行串联。
WITH cte_string AS
(
SELECT '1' AS [value]
UNION
SELECT '2'
)
SELECT '' + [value]
FROM cte_string
FOR XML PATH('')
在SQL 2017中使用新的STRING_AGG函数进行串联:
DECLARE @string VARCHAR(MAX)
SELECT @string = STRING_AGG([value], '')
FROM (
SELECT '1' AS [value]
UNION
SELECT '2'
) AS [t]
SELECT @string