MySQL IF NOT NULL, então exiba 1, senão exiba 0

104

Estou trabalhando com uma pequena complicação de exibição aqui. Tenho certeza de que há um recurso IF / ELSE que estou apenas esquecendo.

Tenho 2 tabelas que estou consultando (clientes, endereços). O primeiro tem o registro principal, mas o segundo pode ou não ter um registro para LEFT JOIN.

Desejo exibir um zero se não houver registro na tabela de endereços. E eu quero exibir apenas 1, se houver um registro.

O que tentei até agora:

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

Este primeiro exemplo não faz isso. Mas posso estar utilizando o COALESCE errado.

Como posso exibir um 0, se nulo, e um 1, se houver algo?

coffeemonitor
fonte
possível duplicata do caso condicional NOT NULL SQL
nawfal

Respostas:

211

Em vez de COALESCE(a.addressid,0) AS addressexists, use CASE:

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

ou o mais simples:

(a.addressid IS NOT NULL) AS addressexists

Isso funciona porque TRUEé exibido como 1no MySQL e FALSEcomo 0.

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

Cuidado se você está vindo de C / C ++ e espera que isso funcione:

select if(name, 1, 0) ..

Mesmo se 'nome' não for NULL, ao contrário de C, uma condição falsa ainda é acionada e a instrução acima retorna 0. Assim, você deve se lembrar de verificar explicitamente se há NULL ou string vazia:

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

PS O exemplo de Eugen acima está correto , mas eu queria esclarecer essa nuance, pois me pegou de surpresa.

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

Outro método sem WHERE, tente este ..

Selecionará os valores Vazio e NULL

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

Ele será definido como nulo se for uma string vazia, então também será verdadeiro.

PodTech.io
fonte
Também útil: selecione IFNULL (fieldname, "1") em tablename;
PodTech.io
1

Na verdade, você pode usar uma instrução IF nas versões mais recentes do MySQL.

IF(expr,if_true_expr,if_false_expr)

IE:

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

Se estiver no TSQL, você pode tentar:

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

SQL Server deve funcionar

Kevin Chen
fonte