2009-08-20 13 views
5

Versión del servidor MySQL 5.0.45. Considere lo siguiente:Manejo del conjunto vacío en la instrucción CASE de MySQL

(SELECT CASE 
    WHEN t.group_id = 12 THEN 'yes' 
    ELSE 'no' 
    END 
    FROM sample_table t 
    WHERE t.user_id = 2 
    AND t.group_id = 12) as foo 

Esta subconsulta de una declaración más grande funciona como yo esperaría, produciendo una o 'no' valor de cadena 'sí' la mayor parte del tiempo. No es ideal, pero eso es lo que obtienes por trabajar en el código de otra persona.

Sin embargo, a veces el select puede legítimamente devolver un conjunto vacío, en cuyo caso foo se establece en NULL. Esto en realidad no rompe la aplicación, pero es irritante. ¿Hay alguna manera de garantizar que foo siempre será "sí" o "no", incluso si no hay filas coincidentes en la tabla?

Respuesta

5

Si se trata de una subconsulta escalar, (es decir, se utiliza en una cláusula SELECT o WHERE, no en la cláusula FROM), a continuación, utilizar esto:

IF(
EXISTS 
(
SELECT NULL 
FROM sample_table t 
WHERE t.user_id = 2 
     AND t.group_id = 12 
), 'yes', 'no' 
) 

o incluso esto:

COALESCE(
(
SELECT 'yes' 
FROM sample_table t 
WHERE t.user_id = 2 
     AND t.group_id = 12 
), 'no') 
+0

Muchas gracias ¡mucho! –

0

Si desea que el conjunto vacío para representar un caso de "no", que probablemente podría hacer esto en su lugar:

select ... where ... (foo = 'no' or foo is null) 

Esto sería manejar tanto casees sin tener que cambiar drásticamente su subconsulta.

Cuestiones relacionadas