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?
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
.
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
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.
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
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.
Si dans TSQL, vous pouvez essayer:
SELECT IIF(a.addressid IS NULL, 0, 1) AS addressexists
SQL Server devrait fonctionner
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