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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top