2016-07-07 2 views
1

ich eine Datenbanktabelle "table_name1" in SQL Server 2012 habe, und ich bin mit SQL Server Management Studio Version 10.Wie SQL-Abfrage ausführen, um Daten aus einer der drei Spalten zu ziehen?

Daten in der Tabelle wie folgt aussehen:

colpkey col1 col2 col3 
1234 AB1234 AB1234 
1265 BS5379 BS5379 BS5379 
2323 WE7865 WE7865 WE7865 
3267   WB7690 WB7690 
6543 NULL DH6583 
8798     NULL 
9403 BF6543   NULL 
9856 BH7548 BH7548 BH7548 

Die Abfrage ich diese Tabelle erstellen Beispieltabelle:

Ich möchte eine Abfrage schreiben, so dass es zwei Spalten ziehen sollte, "Colpkey" und "Col". Das "col" sollte einen Wert von "col1" haben. Wenn "col1" NULL oder leer ist, sollte es einen Wert von "col2" erhalten. Wenn "col2" NULL oder leer ist, sollte es einen Wert von "col3" erhalten. Und wenn alle "col1", "col2" und "col3" entweder leer oder NULL sind, dann sollte der Wert "col" leer sein ('').

Also für die gegebene Probe „table_name1“ die Abfrage sollte Daten wie ziehen:

colpkey col 
1234 AB1234 
1265 BS5379 
2323 WE7865 
3267 WB7690 
6543 DH6583 
8798  
9403 BF6543 
9856 BH7548 

Wie kann ich Abfrage schreiben, dies zu tun? Ich habe versucht, CASE zu verwenden und kam mit folgenden Abfrage nach oben:

select colpkey, 
Case WHEN (col1 != null and col1!= '') then col1 
    ELSE 
    (CASE WHEN (col2 != null and col2!= '') then col2 
    ELSE 
    (CASE WHEN (col3 != null and col3!= '') then col3 
    ELSE '' END) END) END as col 
from table_name1; 

Aber es zeigt leere für jede Zeile, wie:

colpkey col 
1234  
1265  
2323  
3267  
6543  
8798  
9403  
9856  

Bitte legen nahe, wo ich mit der Abfrage werde falsch?

Antwort

2

Ich mag die Standard-SQL-coalesce Funktion über SQL Server-eigenen isnull für die Suche nach nicht-null-Werte verwenden, und wir können auch nullif nutzen die "leere" Anforderung gerecht zu werden:

select colpkey, coalesce(nullif(col1, ''), nullif(col2, ''), nullif(col3, ''), '') as col 
from table_name1; 

UPDATE:

Um zu antworten, "wo ich mit der Abfrage falsch liege?" und wie von @ ToddVrba erwähnt, sollten Sie nicht mit Null vergleichen, indem Sie Standardvergleichsoperatoren wie equals, less-than und so verwenden. Es hilft, Null im relationalen Datenbankland als "unbekannt" zu betrachten, was bedeutet, dass der Vergleich eines bekannten Werts mit einem unbekannten Wert immer einen unbekannten Wert oder null ergibt. Sie sollten mit 0 vergleichen, indem Sie is null oder is not null verwenden.

Zusätzlich ist Ihre Fallaussage übermäßig kompliziert; Sie benötigen nur eine case-Anweisung, wie in:

select colpkey, 
case when col1 is not null and col1 != '' then col1 
    when col2 is not null and col2 != '' then col2 
    when col3 is not null and col3 != '' then col3 
    else '' end as col 
from table_name1; 

Obwohl ich die coalesce und nullif Combo seine prägnanten aber genauso lesbar finden.

+0

Sie sind schneller;) –

+0

@AlexKudryashev GMTA. –

+0

Danke Tim für deinen Vorschlag. Es gibt mir das Ergebnis, nach dem ich gesucht habe. Also habe ich deine Antwort akzeptiert. – 300

5

In SQL können Sie NULL mit != nicht vergleichen. Sie müssen IS NOT NULL tun.

Verwandte Themen