Manipulation ensemble vide dans l'instruction MySQL CASE
Question
MySQL version du serveur 5.0.45. Considérez ce qui suit:
( 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
Cette sous-requête d'une déclaration plus fonctionne comme je pense, ce qui donne un « oui » ou « non » valeur de chaîne la plupart du temps. Ce n'est pas idéal, mais c'est ce que vous obtenez pour travailler sur le code de quelqu'un d'autre!
Cependant, parfois la sélection peut légitimement retourner un ensemble vide, auquel cas foo est réglé sur NULL. Cela ne veut pas briser en fait la demande, mais il est irritant. Est-il possible que je peux vous garantir que foo sera toujours soit « oui » ou « non », même s'il n'y a pas de lignes correspondantes dans le tableau?
La solution
Si c'est un sous-requête scalaire, puis utilisez cette (i e que vous utilisez dans une clause de SELECT
ou WHERE
, et non dans la clause FROM..):
IF(
EXISTS
(
SELECT NULL
FROM sample_table t
WHERE t.user_id = 2
AND t.group_id = 12
), 'yes', 'no'
)
ou même ceci:
COALESCE(
(
SELECT 'yes'
FROM sample_table t
WHERE t.user_id = 2
AND t.group_id = 12
), 'no')
Autres conseils
Si vous voulez que l'ensemble vide pour représenter un « non » cas, vous pourriez probablement faire ceci:
select ... where ... (foo = 'no' or foo is null)
gérerait les deux casees sans avoir à changer radicalement sous-requête.