SQL Server 2逗号和1和

时间:2018-08-09 23:59:35

标签: sql sql-server-2012 concatenation concat comma

我正在做一个视图,在一列中,我会把一些名字串联在一起。

理想情况下,我希望此结果看起来像以下内容:

ResultA, ResultB, ResultC and ResultD  
ResultB, ResultC and ResultD  
ResultA and ResultD

所以我希望它在结果之间保持逗号,直到到达最后一个在其前面放置AND而不是逗号的最后结果。

我可以执行查询以获取我需要的列,但是不知道如何执行以上操作...

select 
    isnull(replace(isnull(givenname, '') + ' ' +
       (isnull(middlename, '') + ' ' + (isnull(lastname, ''), ' ', ' '), '') + 
       isnull(companyname, '') as Name
from
    table1 with (nolock) 
left outer join
    table2 on t1key = t2key     
left outer join
    table3 ON t1key = t3key

我在其他地方找到了此查询,它将为我所有内容加上逗号,但是在最后一个结果之前,我仍然需要'and'。

SELECT 
    ID, Name,
    STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX))
           FROM @T T2 
           WHERE T1.id = T2.id AND T1.name = T2.name
           FOR XML PATH('')), 1, 1, '') SOMECOLUMN
FROM 
    @T T1
GROUP BY 
    id, Name

1 个答案:

答案 0 :(得分:0)

您可以使用row_number()窗口函数来枚举行。当数字等于1时,将其作为最后一行并加上' and ',否则加上', '-为此使用CASE ... END

但是请确保您也按与OVER的{​​{1}}子句中使用的表达式相同的顺序对整个结果进行排序,但方向相反(row_number()而非ASC反之亦然)。否则,您将DESC放在第一个值之前,而不是最后一个值。

由于前置字符串不再具有统一的长度(' and '', '),因此通常的' and '将不容易工作。解决该问题的一种方法是将行号与表的行数进行比较-我们可以在子查询中获得该行号。如果它们相等,则跳过前置。再次可以使用stuff(),另一个嵌套在其中。

由于我不清楚您的架构,因此我举一个不相关的示例:

CASE ... END

db<>fiddle