2017-03-02 9 views
0

Ich habe eine Abfrage, die Spalten aus einer Tabelle auswählt, wo die Bedingung erfüllt ist, das Problem ist, diese Logik wird mehrmals wiederholt (einmal für jede Spalte erforderlich) und fragte mich, ob es ein besseres gab Art und Weise es zu tun.TSQL - Mehrere Aliase für CASE WHEN Anweisung

SELECT 
    CASE 
    WHEN (date1 IS NULL) THEN [date2]  
    WHEN (date1 IS NOT NULL OR (date1 IS NOT NULL AND date2 IS NOT NULL)) THEN [date1] 
    ELSE '' 
    END AS selectedDate 

//Repeat above statement for [day], [hour], [minute] 

Ich möchte wissen, ob ihre möglich, eine Anzahl dieser Fall Aussagen unter derselben Anweisung mit separaten Aliase aggregieren, da sie alle auf den gleichen Bedingungen verlassen, anstatt die gleiche Aussage mehrmals für jede Spalte Umschreiben für Beispiel habe ich versucht, die folgenden:

SELECT 
    CASE 
    WHEN (date1 IS NULL) THEN [date2] as "selectedDate", [day2] as "day", [hour2] as "hour", [minute2] as "minute" 
    WHEN (date1 IS NOT NULL OR (date1 IS NOT NULL AND date2 IS NOT NULL)) THEN [date1] as "selectedDate", [day1] as "day", [hour1] as "hour", [minute1] as "minute" 
    ELSE '' 
+0

Sie könnten eine Funktion schreiben, die die CASE-Logik enthält und nur Ihre Daten angeben, wenn sie außer Kontrolle geraten sollte. – Jens

+0

@Jens Ich dachte das, aber ID muss die Spalte als Parameter statt den Wert würde ich nicht übergeben? –

Antwort

1

Nicht so, wie Sie beschreiben ...

Eine Alternative wäre isnull() oder coalesce() zu verwenden:

select 
    SelectedDate = coalesce(date1,date2) 
    , [Day]  = coalesce(day1,day2) 
    , [Hour]  = coalesce(hour1,hour2) 
    , [Minute]  = coalesce(minute1,minute2) 
from t 
0

Nr. Jede Spalte benötigt eine eigene SELECT-Anweisung.

Für Ihre spezielle Anwendung dieser CASE-Anweisung könnten Sie stattdessen COALESCE verwenden.