在SELECT中使用CASE来过滤掉NULL记录

时间:2016-11-30 20:26:39

标签: sql sql-server-2008 tsql sql-server-2008-r2

我需要通过不同的连接进行筛选,以便在10个列表中选择前4个,但是由于不一致,它们并非都从1开始,而且有些有差距。

我有以下代码来填充列表中的第一个

COALESCE (CASE 
WHEN 1 IS NOT NULL THEN 1 END,
WHEN 2 IS NOT NULL THEN 2 END,
WHEN 3 IS NOT NULL THEN 3 END,
WHEN 4 IS NOT NULL THEN 4 END,
WHEN 5 IS NOT NULL THEN 5 END,
WHEN 6 IS NOT NULL THEN 6 END
 ) AS COL1

这很好用,问题是当我去做第二列时。它返回的值与我无法与之前的COL1相比,因为它是别名。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

在SQL Server中,这与case语句几乎不可能 - 它们会变得非常复杂。

相反,您可以将数据展开成行,然后将数据重新聚合到单独的列中,从而过滤出NULL。以下是使用outer apply

的示例
select . . ., x.*
from . . . outer apply -- all your joins go here
     (select max(case when seqnum = 1 then col end) as col_1,
             max(case when seqnum = 2 then col end) as col_2,
             max(case when seqnum = 3 then col end) as col_3,
             max(case when seqnum = 4 then col end) as col_4             
      from (select col, row_number() over (order by ordering) as seqnum
            from (values (t1.col, 1), (t2.col, 2), . . . 
                 ) v(col, ordering)
            where col is not null
           ) v
     ) x