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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top