Manipulación del conjunto vacío en la sentencia CASE MySQL
Pregunta
versión del servidor MySQL 5.0.45. Considere lo siguiente:
( 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 lo ideal, pero eso es lo que se obtiene para trabajar en el código de otra persona!
Sin embargo, a veces el selecto legítimamente puede devolver un conjunto vacío, en cuyo caso foo se establece en NULL. Esto en realidad no romper la aplicación, pero es irritante. ¿Hay alguna manera puedo garantizar que foo será siempre sea 'sí' o 'no', incluso si no hay filas coincidentes en la tabla?
Solución
Si se trata de una subconsulta escalar, y luego usar este (i correo se utiliza en una cláusula SELECT
o WHERE
, no en la cláusula FROM..):
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')
Otros consejos
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 manejar tanto casees sin tener que cambiar drásticamente su subconsulta.