MySQL: conversión de tipo NULL a 0


81

Supongamos la siguiente tabla (por ejemplo, un resultado de varias declaraciones de combinación internas):

id | column_1 | column_2
------------------------
 1 |  1       | 
 2 |  2       | 2
 3 |          | 3

Que podría obtener, por ejemplo, de la siguiente declaración:

select a.id, t1.column_1, t2.column_2
from a
left join t1 on a.id = t1.id
left join t2 on a.id = t2.id

Ahora, si quisiera resumir t1.column_1 y t2.column_2 de la siguiente manera

select 
    a.id, 
    t1.column_1, 
    t2.column_2,
    (t1.column_1 + t2.column_2) as cumulated
from a
left join t1 on a.id = t1.id
left join t2 on a.id = t2.id

El resultado se verá de la siguiente manera:

id | column_1 | column_2 | cumulated
------------------------------------
 1 |  1       | NULL     | NULL
 2 |  2       | 2        | 4
 3 |  NULL    | 3        | NULL

Mi pregunta básicamente es: ¿hay alguna manera de encasillar NULL en 0 para hacer algunas matemáticas?

Lo he intentado CONVERT(t1.column_1, SIGNED)y CAST(t1.column_1 as SIGNED), pero se NULLmantiene un NULL.

Respuestas:


152

Úselo IFNULL(column, 0)para convertir el valor de la columna a cero. Alternativamente, la función COALESCE hará lo mismo, excepto que (1) COALESCEcumple con ANSI, IFNULLno lo es y (2) COALESCEtoma un número arbitrario de columnas / valores y devolverá el primer valor no nulo que se le haya pasado.


y la unión puede tener más de un valor?
ante.sabo

10
Sí ... entonces COALESCE (columna1, columna2, 0) devolverá el primer valor no nulo de estos valores. Tenga en cuenta que esto funciona horizontalmente, no verticalmente. Las columnas deben pertenecer a la misma fila de la tabla.
David Andres

@rexem: Gracias, es muy amable de su parte decirlo. ¡Muy apreciado!
David Andres

@David Andres Un millón de agradecimientos. Si tan solo pudiera votar por segunda vez.
historia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.