如果为NULL,则填充列,下一列中的数据为非空

时间:2017-01-05 13:52:43

标签: sql sql-server

假设我有下表,其中包含唯一ID和4个属性列...

|ID|  |Attribute 1|  |Attribute 2|  |Attribute 3|  |Attribute 4|
1          RED            NULL           BLUE          GREEN
2          NULL           BLUE           GREEN         NULL
3          GREEN          YELLOW         NULL          BLUE
4          YELLOW         NULL           NULL          GREEN

我可以在SQL Server 2014中使用什么来说:如果属性1为NULL,则使用属性2,但如果属性2为NULL,则使用属性3,依此类推......我将使用CASE语句,但是我不确定如何超越CASE WHEN属性1是空的那么属性2,但那么如果属性2是NULL呢?然后,我如何选择非NULL的下一列值?

我想以某种方式得到上述内容,对此......

|ID|  |Attribute 1|  |Attribute 2|  |Attribute 3|  |Attribute 4|
1          RED            BLUE           GREEN        NULL
2          BLUE           GREEN          NULL         NULL
3          GREEN          YELLOW         BLUE         NULL
4          YELLOW         GREEN          NULL         NULL

2 个答案:

答案 0 :(得分:2)

这很痛苦,但在SQL Server中,您可以使用outer apply和其他一些逻辑:

select t.id,
       v.attribute1, v.attribute2, v.attribute3, v.attribute4
from t outer apply
     (select max(case when seqnum = 1 then a end) as attribute1,
             max(case when seqnum = 2 then a end) as attribute2,
             max(case when seqnum = 3 then a end) as attribute3,
             max(case when seqnum = 4 then a end) as attribute4             
      from (select v.*, row_number() over (order by n) as seqnum
            from (values (1, t.attribute1), (2, attribute2), (3, t.attribute3), (4, t.attribute4)
                 ) v(n, a)
            where a is not null
           ) v
      ) v;

这将对数据进行分离,然后重新生成值。

答案 1 :(得分:0)

isNull有两个参数:表达式和后备。您需要使用isNull次呼叫的组合:

isNull(attribute1, isNull(attribute2, isNull(attribute3, attribute4)))

Documentation