MySQL JEŚLI NIE NULL, następnie wyświetl 1, w przeciwnym razie wyświetl 0

105

Pracuję tutaj z małą komplikacją wyświetlania. Jestem pewien, że istnieje możliwość IF / ELSE, którą po prostu przeoczam.

Mam 2 tabele, które odpytuję (klienci, adresy). Pierwsza ma główny rekord, ale druga może, ale nie musi, zawierać rekord LEFT JOIN do.

Chcę wyświetlić zero, jeśli w tabeli adresów nie ma rekordu. Chcę wyświetlić tylko 1, jeśli istnieje rekord.

Co próbowałem do tej pory:

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

Ten pierwszy przykład tego nie robi. Ale być może źle wykorzystuję COALESCE.

Jak mogę wyświetlić 0, jeśli null, i 1, jeśli coś istnieje?

coffeemonitor
źródło
możliwy duplikat warunkowego SQL
nawfal

Odpowiedzi:

211

Zamiast COALESCE(a.addressid,0) AS addressexistsużywać CASE:

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

lub prostsze:

(a.addressid IS NOT NULL) AS addressexists

To działa, ponieważ TRUEjest wyświetlany jako 1MySQL i FALSEjako 0.

ypercubeᵀᴹ
źródło
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
źródło
17

Ostrożnie, jeśli pochodzisz z C / C ++ i oczekujesz, że to zadziała:

select if(name, 1, 0) ..

Nawet jeśli 'name' nie ma wartości NULL, w przeciwieństwie do C, warunek fałszywy nadal wyzwala, a powyższa instrukcja zwraca 0. W związku z tym musisz pamiętać, aby jawnie sprawdzić NULL lub pusty ciąg:

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

Powyższy przykład PS Eugena jest poprawny , ale chciałem wyjaśnić ten niuans, ponieważ zaskoczył mnie.

Sławomira
źródło
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
źródło
2

Inna metoda bez GDZIE, spróbuj tego ...

Wybierze wartości puste i NULL

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

Ustawi null, jeśli jest to pusty ciąg, a następnie będzie również prawdziwy.

PodTech.io
źródło
Przydatne: wybierz IFNULL (nazwa pola, "1") z nazwy tabeli;
PodTech.io
1

W rzeczywistości możesz użyć instrukcji IF w najnowszych wersjach MySQL.

IF(expr,if_true_expr,if_false_expr)

TO ZNACZY:

SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors
Salvi Pascual
źródło
0

Jeśli w ramach TSQL, możesz spróbować:

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

SQL Server powinien działać

Kevin Chen
źródło