MySQL SI NO ES NULL, luego muestra 1, de lo contrario muestra 0

104

Estoy trabajando con una pequeña complicación de visualización aquí. Estoy seguro de que estoy pasando por alto una capacidad IF / ELSE.

Tengo 2 tablas que estoy consultando (clientes, direcciones). El primero tiene el registro principal, pero el segundo puede tener o no un registro al que LEFT JOIN.

Quiero mostrar un cero si no hay ningún registro en la tabla de direcciones. Y solo quiero mostrar 1, si existe un registro.

Lo que he intentado hasta ahora:

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 primer ejemplo no lo hace. Pero puede que esté utilizando mal COALESCE.

¿Cómo puedo mostrar un 0, si es nulo, y un 1, si existe algo?

monitor de cafe
fuente
posible duplicado de SQL de caso condicional NOT NULL
nawfal

Respuestas:

211

En lugar de COALESCE(a.addressid,0) AS addressexists, use CASE:

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

o el más simple:

(a.addressid IS NOT NULL) AS addressexists

Esto funciona porque TRUEse muestra como 1en MySQL y FALSEcomo 0.

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

Tenga cuidado si viene de C / C ++ y espera que esto funcione:

select if(name, 1, 0) ..

Incluso si 'nombre' no es NULL, a diferencia de C, una condición falsa aún se activa y la declaración anterior devuelve 0. Por lo tanto, debe recordar verificar explícitamente NULL o una cadena vacía:

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

PS El ejemplo de Eugen arriba es correcto , pero quería aclarar este matiz ya que me tomó por sorpresa.

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

Otro método sin DÓNDE, prueba este ...

Seleccionará valores vacíos y nulos

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

Se establecerá en nulo si es una cadena vacía, entonces también será verdadero en eso.

PodTech.io
fuente
También es útil: seleccione IFNULL (nombre de campo, "1") de nombre de tabla;
PodTech.io
1

De hecho, puede usar una declaración IF en las últimas versiones de MySQL.

IF(expr,if_true_expr,if_false_expr)

ES DECIR:

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

Si está dentro de TSQL, puede probar:

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

SQL Server debería funcionar

Kevin Chen
fuente