Sep 23
Sumowanie pól, które mogą mieć wartość NULL
Niedawno odkryłem dość irytujący problem w MySQL. Otóż okazuje się, że nie można sumować wartości NULL z dowolną cyfrą. Wynik takiego zapytania:
Zwróci nam wartość NULL. Jak na mój chłopski rozum to powinna być wartość 5. Ten mały problem, może czasami całkiem sprawnie pokrzyżować jakieś zliczania/etc przez co wyniki, które otrzymamy mogą mijać się z rzeczywistością.
Na szczęście udało mi się znaleźć całkiem zgrabne rozwiązanie. Jest nim funkcja COALESCE, która zwraca pierwszą nie-pustą wartość podaną podczas wywołania. Drobna modyfikacja zapytania i mamy poprawny wynik:

September 26th, 2008 at 12:02
Zasadniczo to MySQL ma rację - powinno być NULL. NULL gdyby miało wartość 0 byłoby zerem, nie null’em.
NULL oznacza wartość nieokreśloną, nieznaną. Równanie x + 5 = y - mniej więcej tak to nalezy rozumieć.
Wykorzystanie CASE nie byłoby efektywniejsze?
September 26th, 2008 at 08:35
W sumie to masz rację.
Co do Case, to wydaje mi się to takim przerostem formy nad treścią :) ew skorzystałbym z IFNULL
October 1st, 2008 at 12:05
Użytkownikowi nie wyświetlimy “Liczba Twoich punktów: NULL” a o to nie trudno. Ładniej obsłużyć to na poziomie wyciągania danych :) A sama konstrukcja jest ładniejsza niż IF i CASE w mysql. Niestety nie wiem jak z wydajnością? Macie jakieś doświadczenia?
November 7th, 2008 at 12:34
Tak jak poprzednik, mimo wszystko polecam użyć PHP do zliczania danych. Mysql powinien je tylko wyciągać. A w PHP przecież zawsze można zrobić sobie rzutowanie na (integer) i z NULLa mieć `0`.
December 17th, 2008 at 11:00
to znane zagdanienie relacyjnych baz danych. null to wartosc nieznana ale to nie zero!!! baza danych nie wie co z tym zrobic wiec nie moze dac wyniku jakiegokolwiek dzialania. najprostszym i jednym z najbardziej zalecanych rozwiazan jest unikanie wartosci null poprzez klauzule not null przy definicji kolumny. dlaczego? poniewaz wielu specjalistow uwaza to za jeden z najwiekszych problemow relacyjnych baz danych i jezyka sql ze NULL nie oznacza konkretnego stanu a skoro nie oznacza takowego to lepiej nie dopuscic do wystepowania wartosci null.
polecam ksiazki Joe Celko ktore zajmuja sie tym i wieloma innymi zaawansowanymi tematami jezyka sql.