将行连接成一个字符串,有什么不同的方式,它们分别叫什么?

时间:2019-03-24 13:29:52

标签: sql tsql

下面是两个查询,在尝试执行sql学习任务时,我尝试锻炼以下问题。

  1. 查询1-在sql中这叫什么? 我试图通过Web搜索用法示例,但不知道要搜索什么。

  2. 查询1和2给我相同的结果,不同吗? 执行计划看起来很相似,除了最后一个有一个额外的步骤: UDX成本为0%步骤

  3. 将行放入字符串中会首选哪个?

  4. 这是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;

1 个答案:

答案 0 :(得分:0)

您已经注意到,在SQL中有多种串联字符串的方法。我不确定这些使用的方法是否有特定的名称。我将其描述为“我正在使用...连接字符串”。

首选真的更取决于您的个人品味。例如,由于以下原因,即使比较慢,我的首选方法还是使用STRING_AGG。因此,请帮自己一个忙,并更新您的SQL Server。

  1. 这是一个内置功能。更高版本中的更新可以使其更快,而无需更改任何代码。
  2. 其意图比其他方法要清晰得多。如果其他人浏览了您的SQL,则毫无疑问您将要完成什么。
  3. 更容易扩展。除非您了解使用SQL的方式,否则,如果您想在每个值之间添加逗号或任何其他分隔符,则必须考虑必须进行哪些更改才能实现此目的。使用STRING_AGG,只需更改参数即可。在带有STRING_AGG的查询上使用GROUP BY很简单。在其他方法上,不是很多。

使用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