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


105

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

J'ai 2 tables que j'interroge (clients, adresses). Le premier a l'enregistrement principal, mais le second peut ou non avoir un enregistrement à GAUCHE JOIN.

Je veux afficher un zéro s'il n'y a pas d'enregistrement dans la table des adresses. Et je veux afficher seulement 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, si nul, et un 1, si quelque chose existe?


duplication possible du conditionnel NOT NULL case SQL
nawfal

Réponses:


211

Au lieu de COALESCE(a.addressid,0) AS addressexists, utilisez 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 car TRUEest affiché comme 1dans MySQL et FALSEcomme 0.


96
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

17

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

select if(name, 1, 0) ..

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

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

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


16
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

2

Une autre méthode sans WHERE, essayez ceci.

Sélectionne à la fois les valeurs vides et nulles

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

Il mettra null si c'est une chaîne vide, alors sera vrai sur cela également.


Aussi utile: sélectionnez IFNULL (fieldname, "1") dans tablename;
PodTech.io

1

Vous pouvez en fait utiliser une instruction IF dans les dernières versions de MySQL.

IF(expr,if_true_expr,if_false_expr)

C'EST À DIRE:

SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors

0

Si dans TSQL, vous pouvez essayer:

SELECT IIF(a.addressid IS NULL, 0, 1) AS addressexists

SQL Server devrait fonctionner

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.