web-dev-qa-db-fra.com

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

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

J'ai 2 tables que je interroge (clients, adresses). Le premier a l'enregistrement principal, mais le second peut avoir ou non un enregistrement sur lequel LEFT JOIN est associé.

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 essayé 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 je me sers peut-être mal de COALESCE.

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

95
coffeemonitor

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 parce que TRUE est affiché sous la forme 1 dans MySQL et FALSE sous la forme 0.

191
ypercubeᵀᴹ
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
86
Eugen Rieck

Attention si vous venez de C/C++ et espérez que cela fonctionne:

select if(name, 1, 0) ..

Même si 'name' n'est pas NULL, contrairement à C, une fausse condition est toujours déclenchée et l'instruction ci-dessus renvoie 0. Vous devez donc vous rappeler de vérifier explicitement si NULL ou une chaîne 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.

16
Slawomir
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
13
bucko

Une autre méthode sans WHERE, essayez ceci ..

Sélectionne les valeurs vide et NULL

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

Il mettra null s'il s'agit d'une chaîne vide, alors soyez vrai à ce sujet également.

2
PodTech.io

Si dans TSQL, vous pouvez essayer:

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

SQL Server devrait fonctionner

0
Kevin Chen

Vous pouvez réellement 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
Salvi Pascual