TSQL上String.Join的等价物是什么?

Gil*_*Gil 37 t-sql sql-server

可能重复:
是否有办法创建SQL Server函数以将子查询中的多个行"连接"到单个分隔字段中?

大家好!

我正在寻找一种简单的方法来连接'n'值.就像是:

SELECT MyConcat(',', T.TextColumn)
FROM SomeTable AS T
WHERE T.SomeOtherColumn = SomeCondition
Run Code Online (Sandbox Code Playgroud)

所以,如果我有一个像这样的表:

SomeTable:
Id  | TextColumn | SomeOtherColumn
----+------------+----------------
1   | Qwerty     | Y
2   | qwerty     | N
3   | azerty     | N
4   | Azerty     | Y
Run Code Online (Sandbox Code Playgroud)

它会导致类似于:

SQL:
SELECT MyConcat(';', T.TextColumn)
FROM SomeTable AS T
WHERE T.SomeOtherColumn = 'Y'

RESULT:
'Qwerty;Azerty'
Run Code Online (Sandbox Code Playgroud)

小智 40

这应该做的伎俩:

DECLARE @Result VARCHAR(MAX);

SELECT
    @Result = CASE
        WHEN @Result IS NULL
        THEN T.TextColumn
        ELSE @Result + ';' + T.TextColumn
    END
FROM
    SomeTable AS T
WHERE
    T.SomeOtherColumn = 'Y';

SELECT @Result
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果`textcolumn`中的任何值为空,将会产生意想不到的结果。要了解我的意思,请将其放在DECLARE行下并运行:`with sometable as(选择'a'作为textcolumn,'y'作为someothercolumn union都选择'b','n'union都选择null,'y 'union all select'd','y')`->期望'ad',但实际结果为'd',因为'null +'some text'`为'null'。考虑改用CONCAT或COALESCE (2认同)

Hog*_*gan 30

SELECT CAST(TextColumn + ';' AS VARCHAR(MAX)) 
FROM SomeTable
WHERE SomeOtherColumn = 'Y'
FOR XML PATH ('')
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢尾随;,则可以从结果中删除该字符.


2017年编辑

许多平台现在支持窗口函数LISTAGG()

  • 对于 SQL Server,您现在可以使用“STRING_AGG”。[STRING_AGG (Transact-SQL) - SQL Server | 微软文档](https://learn.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-ver15) (2认同)