2011-05-29 67 views
32

可能重复:
Is there a way to create a SQL Server function to “join” multiple rows from a subquery into a single delimited field?什么是TSQL上的String.Join的等价物?

大家好!

我正在寻找一种简单的方法来连接'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' 
+0

我已经找到了解决方案通过创建以下功能: CREATE FUNCTION [dbo]。[JoinTexts] ( @deli斜切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') – Gil 2011-05-30 15:14:11

回答

36

这应该做的伎俩:

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 
25
SELECT CAST(TextColumn + ';' AS VARCHAR(MAX)) 
FROM SomeTable 
WHERE SomeOtherColumn = 'Y' 
FOR XML PATH ('') 

如果你不喜欢尾随;你可以从结果中删除字符。


编辑在2017年

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

+0

它非常好 – 2015-11-11 11:23:22

相关问题