MySQL WENN NICHT NULL, dann 1 anzeigen, sonst 0 anzeigen

104

Ich arbeite hier mit einer kleinen Anzeigekomplikation. Ich bin sicher, dass es eine IF / ELSE-Funktion gibt, die ich nur übersehen habe.

Ich habe 2 Tabellen, die ich abfrage (Kunden, Adressen). Der erste hat den Hauptdatensatz, aber der zweite kann einen Datensatz haben, zu dem LEFT JOIN gehören kann oder nicht.

Ich möchte eine Null anzeigen, wenn die Adresstabelle keinen Datensatz enthält. Und ich möchte nur 1 anzeigen, wenn ein Datensatz vorhanden ist.

Was ich bisher versucht habe:

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

Dieses erste Beispiel macht es nicht. Aber ich kann COALESCE falsch verwenden.

Wie kann ich eine 0 anzeigen, wenn null, und eine 1, wenn etwas vorhanden ist?

Kaffeemonitor
quelle
Mögliches Duplikat von Conditional NOT NULL case SQL
nawfal

Antworten:

211

COALESCE(a.addressid,0) AS addressexistsVerwenden Sie stattdessen CASE:

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

oder das einfachere:

(a.addressid IS NOT NULL) AS addressexists

Dies funktioniert, weil TRUEes wie 1in MySQL und FALSEals angezeigt wird 0.

ypercubeᵀᴹ
quelle
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
quelle
17

Vorsicht, wenn Sie aus C / C ++ kommen und erwarten, dass dies funktioniert:

select if(name, 1, 0) ..

Selbst wenn 'name' im Gegensatz zu C nicht NULL ist, wird immer noch eine falsche Bedingung ausgelöst und die obige Anweisung gibt 0 zurück. Daher müssen Sie daran denken, explizit nach NULL oder einer leeren Zeichenfolge zu suchen:

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

PS Eugens Beispiel oben ist richtig , aber ich wollte diese Nuance klarstellen, da sie mich überrascht hat.

Slawomir
quelle
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
quelle
2

Eine andere Methode ohne WO, versuchen Sie dies ..

Wählt sowohl leere als auch NULL-Werte aus

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

Es wird null gesetzt, wenn es sich um eine leere Zeichenfolge handelt, und dies gilt auch für diese.

PodTech.io
quelle
Ebenfalls nützlich: Wählen Sie IFNULL (Feldname, "1") aus dem Tabellennamen.
PodTech.io
1

Sie können tatsächlich eine IF-Anweisung in den neuesten Versionen von MySQL verwenden.

IF(expr,if_true_expr,if_false_expr)

IE:

SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors
Salvi Pascual
quelle
0

In TSQL können Sie Folgendes versuchen:

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

SQL Server sollte funktionieren

Kevin Chen
quelle