SENTENCIA SQL-CASE-sentencia WHEN Y sentencia


Estoy teniendo un problema tratando de encontrar la mejor solución para el siguiente problema.

Tengo una compra de mesa que tiene una columna de Estado, donde 1 está autorizado, 2 está completado y sus son algunos otros también.

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

Tengo la siguiente consulta:

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

Pero lo que tengo que hacer es lo siguiente:

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

La única manera que se me ocurre de hacer esto está teniendo una declaración IF masiva alrededor de la consulta, una para un minorista de un solo paso y otra para un minorista de dos pasos, ya que mi entendimiento es que la cláusula WHEN no puede tener un 'Y' en ella.

Sin embargo, esto parece demasiado largo; ¿alguien tiene ideas más ordenadas?

Author: KyleMit, 2012-01-19

3 answers

Puedes 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 un Y aquí es que no está comprobando los CASOS de ESTADO, sino que está ENCAJONANDO las Condiciones.

La parte clave aquí es que la condición de ESTADO es una parte del CUÁNDO.

 41
Author: Bassam Mehanni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-19 15:26:54

Simplemente cambia tu sintaxis 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 no coloca la expresión field antes de la instrucción CASE, puede colocar prácticamente cualquier campo y comparación que desee. Es un método más flexible pero tiene una sintaxis ligeramente más detallada.

 8
Author: JNK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-19 15:17:01
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;
 -2
Author: Zul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-26 01:26:35