2012-01-19 14 views
18

Sto riscontrando un problema nel tentativo di elaborare la soluzione più accurata per il seguente problema.SQL - CASE STATEMENT - WHEN statement AND statement

Ho una tabella di acquisto che ha una colonna di stato, per cui 1 è autorizzato, 2 è completato e sono anche alcuni altri.

Ho anche una tabella rivenditore, che ha una colonna RetailerProcessType, in cui 1 è in un passaggio e 2 in due passaggi.

Ora vedere la domanda sotto ...

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

Che cosa devo fare è la seguente:

QUANDO STATE = 2, RetailerProcessType = 1 THEN ' "autorizzato"'

QUANDO STATE = 1, RetailerProcessType = 2 THEN ' "PENDING"'

QUANDO STATE = 2, RetailerProcessType = 2 THEN ' "autorizzato"'

ELSE ' 'rifiutato''

L'unico modo che posso vedere di fare questo sta avendo un enorme IF intorno la query, uno per un rivenditore di uno stadio e un altro per un due fasi, come la mia comprensione è una clausola WHEN non può avere un 'AND' in esso.

Tuttavia, questo sembra orribile e lungo, nessuno ha avuto idee più ordinate?

Steven

risposta

36

che si possa fare in questo modo:

-- 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 

Il motivo si può fare un E qui è che non si sta verificando casi di stato, ma invece si è INVOLUCRO condizioni.

La parte chiave qui è che la condizione STATO è una parte del WHEN.

7

Basta cambiare la sintassi sempre leggermente:

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 

Se non metti l'espressione campo prima dell'istruzione CASE, si può mettere praticamente tutti i campi e confronti in là che tu vuoi. È un metodo più flessibile ma ha una sintassi leggermente più dettagliata.

-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;