2017-01-05 6 views
0

sagen, dass ich mit einer eindeutigen ID und das Attribut 4 Spalten ...in Spalte füllen, wenn NULL mit Daten aus der nächsten Spalte, die 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 

haben die folgende Tabelle ist Was kann ich in SQL Server 2014 verwenden Sagen wir: Wenn Attribut 1 NULL ist, benutze Attribut 2, aber wenn Attribut 2 NULL ist, benutze Attribut 3 und so weiter ... Ich würde eine CASE-Anweisung verwenden, aber ich bin mir nicht sicher, wie ich über CASE hinausgehen soll WENN Attribut 1 NULL DANN Attribut 2 ist, aber was ist, wenn Attribut 2 NULL ist? Wie würde ich dann den nächsten Spaltenwert auswählen, der nicht NULL ist?

Ich möchte irgendwie die oben erhalten, um diese ...

|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

Betrachten Sie Ihre Tabelle neu zu entwerfen: (id, attrno, Farbe). – jarlh

Antwort

2

Dies ist ein Schmerz, aber in SQL Server, können Sie outer apply und einige zusätzliche Logik verwenden:

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; 

Dadurch werden die Daten deaktiviert und die Werte werden erneut zurückgesetzt.

+0

Aus irgendeinem Grund akzeptieren die CASE-Anweisungen den Spaltenwert a nicht. Ich bekomme den "Ungültigen Spaltennamen 'a'" Fehler. – OhioMike1987

+0

@ OhioMike1987. . . Hoppla, da sollte ein 'a. *' In diesem Subselect stehen. –

0

isNull erhält zwei Parameter: ein Ausdruck und ein Fallback. Sie müssen eine Kombination von isNull Anrufe verwenden:

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

Documentation.

Verwandte Themen