2009-08-20 7 views
5

Version du serveur MySQL 5.0.45. Considérez ce qui suit:Gestion de l'ensemble vide dans l'instruction MySQL CASE

(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 des œuvres plus grandes que 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, le select peut légitimement renvoyer un jeu vide, auquel cas foo est défini sur NULL. Cela ne brise pas l'application, mais c'est irritant. Y at-il un moyen de garantir que foo sera toujours 'oui' ou 'non', même s'il n'y a pas de lignes correspondantes dans la table?

Répondre

5

Si c'est une sous-requête scalaire, (vous utilisez dans une clause SELECT ou WHERE, et non dans la clause FROM), puis utilisez ceci:

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') 
+0

Merci très beaucoup! –

0

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) 

Cela permettrait de gérer les deux casees sans avoir à changer radicalement votre sous-requête.