2017-01-05 15 views
0

とNULLは、私はSQL Serverの2014年に何を使用することができます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 

...私は一意のIDと4つの属性列で、次の表があるとした場合の欄に記入属性1がNULLの場合は属性2を使用しますが、属性2がNULLの場合は属性3などを使用します... CASE文を使用するつもりですが、CASEを超えてどのように処理するかはわかりませんWHEN属性1はNULLです。属性2ですが、属性2がNULLの場合はどうなりますか?どのようにしてNULLでない次の列の値を選択するのですか?

私はこれが痛みですが、SQL Serverでは、あなたはouter applyといくつかの追加のロジックを使用することができます

|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

...これに、何とか上記を取得したい:

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文が列の値を受け入れていません。私は "無効な列名 ''エラーが発生しています。 – OhioMike1987

+0

@ OhioMike1987。 。 。 Ooops、その副選択に 'a。* 'があったはずです。 –

0

isNullは、式とフォールバックの2つのパラメータを取得します。

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

Documentation:あなたはisNull呼び出しの組み合わせを使用する必要があります。

関連する問題