2012-01-19 15 views
18

Mam problem przy próbie wypracowania najmodniejszego rozwiązania dla następującego problemu.SQL - OŚWIADCZENIE CASE - GDY instrukcja i oświadczenie

Mam tabelę Zakup, który ma kolumnę State, przy czym 1 jest autoryzowany, 2 jest zakończony, a niektóre są również inne.

Posiadam również tabelę sprzedawców, która ma kolumnę RetailerProcessType, przy czym 1 to jeden krok, a 2 to dwustopniowy.

Teraz patrz poniższy zapytanie ...

CASE purc.State 
         WHEN 1 THEN '"AUTHORISED"' 
         WHEN 2 THEN '"AUTHORISED"' 
         WHEN 4 THEN '"AUTHORISED"' 
         ELSE '"DECLINED"' 
        END                 AS Autorised_Decline_Status, 

Co muszę zrobić to w następujący sposób:

KIEDY STAN = 2 i RetailerProcessType = 1 Then ' "autoryzowane"'

KIEDY STAN = 1 i RetailerProcessType = 2 Then ' "pending"'

KIEDY STAN = 2 i RetailerProcessType = 2 Then ' "autoryzowane"'

ELSE „«odrzucona»”

Jedynym sposobem, widzę w ten sposób wywiera ogromny IF wokół zapytania, jeden na jednego kroku sprzedawcy, a inny dla dwustopniowo moje rozumienie jest klauzula WHEN nie może zawierać "AND".

Jednak wydaje się to po prostu ohydne i zdyszane, czy ktoś ma jakieś lepsze pomysły?

Steven

Odpowiedz

36

Można zrobić to w ten sposób:

-- Notice how STATE got moved inside the condition: 
CASE WHEN STATE = 2 AND RetailerProcessType IN (1, 2) THEN '"AUTHORISED"' 
    WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"' 
    ELSE '"DECLINED"' 
END 

Powodem można zrobić i tu jest to, że nie sprawdzają przypadków stan, ale zamiast tego są warunki obudowy.

Kluczową częścią jest to, że stan STAN jest częścią KIEDY.

7

Wystarczy zmienić składnię kiedykolwiek tak lekko:

CASE WHEN STATE = 2 AND RetailerProcessType = 1 THEN '"AUTHORISED"' 
    WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"' 
    WHEN STATE = 2 AND RetailerProcessType = 2 THEN '"AUTHORISED"' 
    ELSE '"DECLINED"' 
END 

Jeśli nie umieścić wyraz pola przed stwierdzeniem CASE można umieścić praktycznie żadnych pól i porównań, które tam chcesz. Jest to bardziej elastyczna metoda, ale ma nieco bardziej szczegółową składnię.

-1
SELECT Get_Log.IDNo, Get_Log.StudentName, Get_Log.[Sign-in Date], Get_Log.DurationOfSum, Get_Log.Day, 
CASE WHEN DurationOfSum > 5 THEN '"present"' 
ELSE '"absent"' 
END AS Attendance 
FROM Get_Log;