Manipulação conjunto vazio na instrução MySQL CASE
Pergunta
MySQL Server versão 5.0.45. Considere o seguinte:
( 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 uma instrução maior funciona como eu esperava, produzindo um 'sim' ou 'não' valor de seqüência maior parte do tempo. Não é o ideal, mas é o que você tem para trabalhar no código de outra pessoa!
No entanto, por vezes, a selecção pode legitimamente retornar um conjunto vazio, caso em que foo é definido como NULL. Este na verdade não quebrar o aplicativo, mas é irritante. Existe uma maneira eu posso garantir que foo será sempre quer 'sim' ou 'não', mesmo se não houver registros coincidentes na tabela?
Solução
Se for uma subconsulta escalar, e depois usar essa (i e você usa em uma cláusula SELECT
ou WHERE
, não na cláusula FROM..):
IF(
EXISTS
(
SELECT NULL
FROM sample_table t
WHERE t.user_id = 2
AND t.group_id = 12
), 'yes', 'no'
)
ou mesmo esta:
COALESCE(
(
SELECT 'yes'
FROM sample_table t
WHERE t.user_id = 2
AND t.group_id = 12
), 'no')
Outras dicas
Se você deseja que o conjunto vazio para representar um "não" caso, você provavelmente poderia fazer isso em vez disso:
select ... where ... (foo = 'no' or foo is null)
Este iria lidar com ambos os casees sem ter que mudar drasticamente o seu subconsulta.