MySQL: Rzutowanie typu NULL na 0

82

Załóżmy, że następująca tabela (np. Wynik kilku instrukcji sprzężenia wewnętrznego):

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

Które możesz uzyskać na przykład z następującego stwierdzenia:

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

Teraz, jeśli chciałbym podsumować t1.column_1 i t2.column_2 w następujący sposób

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

Rezultat będzie wyglądał następująco:

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

Moje pytanie w zasadzie brzmi: czy istnieje sposób na typecast z NULL do 0, aby zrobić trochę matematyki?

Próbowałem CONVERT(t1.column_1, SIGNED)i CAST(t1.column_1 as SIGNED), ale NULLpozostaje NULL.

Pierre Spring
źródło

Odpowiedzi:

154

Służy IFNULL(column, 0)do konwersji wartości kolumny na zero. Alternatywnie funkcja COALESCE zrobi to samo, z wyjątkiem tego, że (1) COALESCEjest zgodna z ANSI, IFNULLnie jest, a (2) COALESCEprzyjmuje dowolną liczbę kolumn / wartości i zwróci pierwszą przekazaną jej wartość inną niż null.

David Andres
źródło
a coalesce może mieć więcej niż jedną wartość?
ante.sabo
10
Tak ... więc COALESCE (kolumna1, kolumna2, 0) zwróci pierwszą wartość różną od null. Pamiętaj, że to działa poziomo, a nie pionowo. Kolumny muszą należeć do tego samego wiersza tabeli.
David Andres
@rexem: Dzięki, miło z twojej strony. Bardzo cenione!
David Andres
@David Andres Milion podziękowań. Gdybym tylko mógł zagłosować za drugim razem.
historia