2017-01-05 75 views
0

說我有一個唯一的ID和4分屬性列在下表...填寫欄,如果與下一列數據NULL是NOT NULL

|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 IS NULL THEN屬性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 
+5

考慮重新設計你的表格:(id,attrno,color)。 – jarlh

回答

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; 

這將清除數據,然後重新賦值。

+0

由於某些原因,CASE語句不接受列值a。我收到「無效的列名稱」錯誤。 – OhioMike1987

+0

@ OhioMike1987。 。 。哎呀,在這個子選項中應該有一個'a。*'。 –

0

isNull獲取兩個參數:表達式和回退。您需要使用的isNull調用的組合:

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

Documentation