132 votes

MySQL IF NOT NULL, alors affiche 1, sinon affiche 0

Je travaille avec une petite complication d'affichage ici. Je suis sûr qu'il y a une capacité IF/ELSE que je néglige.

J'ai deux tables que j'interroge (clients, adresses). La première contient l'enregistrement principal, mais la seconde peut ou non contenir un enregistrement auquel effectuer une JOINTE GAUCHE.

Je veux afficher un zéro s'il n'y a pas d'enregistrement dans la table des adresses. Et je veux seulement afficher 1, si un enregistrement existe.

Ce que j'ai tenté jusqu'à présent :

SELECT c.name, COALESCE(a.addressid,0) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

Ce premier exemple ne le fait pas. Mais j'utilise peut-être mal COALESCE.

Comment puis-je afficher un 0, s'il est nul, et un 1, si quelque chose existe ?

251voto

ypercube Points 62714

Au lieu de COALESCE(a.addressid,0) AS addressexists utiliser CASE :

CASE WHEN a.addressid IS NOT NULL 
       THEN 1
       ELSE 0
END AS addressexists

ou le plus simple :

(a.addressid IS NOT NULL) AS addressexists

Cela fonctionne parce que TRUE s'affiche comme suit 1 dans MySQL et FALSE comme 0 .

122voto

Eugen Rieck Points 33670
SELECT c.name, IF(a.addressid IS NULL,0,1) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

21voto

ShoeDah7 Points 346
SELECT 
    c.name, 
    CASE WHEN a.addressid IS NULL THEN 0 ELSE 1 END AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

21voto

Debriter Points 93

Attention si vous venez du C/C++ et que vous vous attendez à ce que cela fonctionne :

select if(name, 1, 0) ..

Même si 'name' n'est pas NULL, contrairement à ce qui se passe en C, une fausse condition se déclenche toujours et l'instruction ci-dessus renvoie 0. Ainsi, vous devez vous rappeler de vérifier explicitement si la chaîne est NULL ou vide :

 select if(name is null or name = '', 0, 1)

PS L'exemple d'Eugen ci-dessus est correct mais je voulais clarifier cette nuance car elle m'a pris par surprise.

4voto

Hariboo Points 1

Une autre méthode sans WHERE, essayez ceci

Sélectionne à la fois les valeurs vides et les valeurs nulles

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

Il mettra null si c'est une chaîne vide, puis sera vrai sur cela aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X