2012-01-19 13 views
18

Tengo un problema tratando de encontrar la solución más adecuada para el siguiente problema.SQL - DECLARACIÓN DE UN CASO - WHEN statement AND statement

Tengo una mesa de compras que tiene una columna de estado, donde 1 está autorizado, 2 se completa y también algunos otros.

También tengo una tabla de minorista, que tiene una columna RetailerProcessType, donde 1 es un paso y 2 es de dos pasos.

Ahora vea la consulta a continuación ...

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

Lo que tengo que hacer es la siguiente:

cuando el estado = 2 y RetailerProcessType = 1 ENTONCES ' "AUTORIZADO"'

Cuando el estado = 1 y RetailerProcessType = 2 ENTONCES ' "pendiente"'

cuando el estado = 2 Y RetailerProcessType = 2 ENTONCES ' "autorizado"'

ELSE ' 'rechazado''

La única forma que veo de hacer esto es tener un enorme IF en torno a la consulta, una para un minorista de un solo paso y otro para una de dos pasos como mi entendimiento es una cláusula WHEN no puede tener un 'AND' en ella.

Sin embargo, esto parece horrible y de largo aliento, ¿alguien tiene ideas más limpias?

Steven

Respuesta

36

que podría hacerlo de esta manera:

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

La razón por la que puede hacer una Y aquí es que usted no está mirando los supuestos de estado, pero en su lugar son condiciones carcasa.

La parte clave aquí es que la condición de ESTADO forma parte de WHEN.

7

Sólo cambia la sintaxis muy ligeramente:

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 

Si usted no pone la expresión de campo antes de la declaración CASE, puede poner más o menos todos los campos y las comparaciones en que hay que usted quiere. Es un método más flexible pero tiene un poco más de sintaxis detallada.

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