【问题标题】:What is the equivalent of String.Join on TSQL? [duplicate]TSQL 上的 String.Join 等价物是什么? [复制]
【发布时间】:2011-09-04 10:52:25
【问题描述】:

可能重复:
Is there a way to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?

大家好!

我正在寻找一种连接“n”值的简单方法。比如:

SELECT MyConcat(',', T.TextColumn)
FROM SomeTable AS T
WHERE T.SomeOtherColumn = SomeCondition

所以如果我有这样的表:

SomeTable:
Id  | TextColumn | SomeOtherColumn
----+------------+----------------
1   | Qwerty     | Y
2   | qwerty     | N
3   | azerty     | N
4   | Azerty     | Y

这会导致类似:

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

RESULT:
'Qwerty;Azerty'

【问题讨论】:

  • 我通过创建以下函数找到了解决方案: CREATE FUNCTION [dbo].[JoinTexts] ( @delimiter VARCHAR(20) , @whereClause VARCHAR(1) ) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @Texts VARCHAR(MAX) SELECT @Texts = COALESCE(@Texts + @delimiter, '') + T.Texto FROM SomeTable AS T WHERE T.SomeOtherColumn = @whereClause RETURN @Texts END GO 用法:SELECT dbo.JoinTexts( ' , ', 'Y')

标签: sql-server tsql


【解决方案1】:
SELECT CAST(TextColumn + ';' AS VARCHAR(MAX)) 
FROM SomeTable
WHERE SomeOtherColumn = 'Y'
FOR XML PATH ('')

如果您不喜欢结尾的 ;,您可以从结果中删除该字符。


2017 年编辑

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

【讨论】:

【解决方案2】:

这应该可以解决问题:

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

【讨论】:

  • 警告:如果textcolumn 中的任何值为空,这将产生意外结果。要了解我的意思,请将其放在 DECLARE 行下并运行它:with sometable as (select 'a' as textcolumn, 'y' as someothercolumn union all select 'b' ,'n' union all select null, 'y' union all select 'd', 'y' ) -> 期待 'ad',但实际结果是 'd',因为 null + 'some text' 是 null。考虑改用 CONCAT 或 COALESCE
猜你喜欢
  • 2011-12-26
  • 2015-06-13
  • 1970-01-01
  • 2012-06-16
  • 2022-01-09
  • 2015-09-21
  • 2015-07-10
  • 2021-07-01
  • 2016-05-19
相关资源
最近更新 更多