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?

cafetière
la source
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.

ypercubeᵀᴹ
la source
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
Eugen Rieck
la source
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.

Slawomir
la source
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
Bucko
la source
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.

PodTech.io
la source
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
Salvi Pascual
la source
0

Si dans TSQL, vous pouvez essayer:

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

SQL Server devrait fonctionner

Kevin Chen
la source