选择查询以使用逗号运算符追加列并忽略空值或空值

时间:2011-07-14 13:00:58

标签: sql-server sql-server-2005 tsql select

我们要求使用逗号运算符附加三个表的varchar列。我们还需要在追加期间忽略NULL或空值。假设表结构如下

declare @t table (col1 varchar(10),col2 varchar(10),col3 varchar(10))
insert into @t
select 'test1','test2','test3' union all
select 'test4',null,'test5' union all
select null,null,'test6' union all
select '','test7',''

预期结果必须如下

Result
--------------------------------
test1,test2,test3
test4,test5
test6
test7

我尝试过使用case语句,但查询变得非常复杂。顺便说一下,我们正在使用SQL Server 2005.寻找任何简单易用的解决方案。提前谢谢。

3 个答案:

答案 0 :(得分:2)

不太优雅;

;with T(string) as (
    select
      isnull(case col1 when '' then null else col1 + ',' end, '')
    + isnull(case col2 when '' then null else col2 + ',' end, '')
    + isnull(case col3 when '' then null else col3 + ',' end, '')
    from @t
)
select left(string, abs(len(string) - 1)) from T

答案 1 :(得分:2)

这是一种非常替代的方式

select reverse(stuff(reverse(coalesce(replace(col1, col1, col1 + ','), '')+ 
coalesce(replace(col2, col2, col2 + ','), '')+
coalesce(replace(col3, col3, col3 + ','), '')), 1,1,'')) Result from @t

答案 2 :(得分:1)

基本上,如果该列不为null / empty,只需在每个列中附加一个逗号。然后,删除结果的最后一个逗号。

SELECT
    CASE
        WHEN RIGHT(T.outColumn, 1) = ',' THEN SUBSTRING(T.outColumn, 1, LEN(T.outColumn) - 1)
        ELSE T.outColumn
    END
FROM
    (
    SELECT
        ISNULL(col1, '') + CASE WHEN ISNULL(col1, '') <> '' THEN ',' ELSE '' END +
        ISNULL(col2, '') + CASE WHEN ISNULL(col2, '') <> '' THEN ',' ELSE '' END +
        ISNULL(col3, '') AS outColumn
    FROM
        @t
    ) AS T