Sep 23

Sumowanie pól, które mogą mieć wartość NULL

Tag: MySQLradmen @ 11:20

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:

5 Responses to “Sumowanie pól, które mogą mieć wartość NULL”

  1. Weirdo says:

    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?

  2. radmen says:

    W sumie to masz rację.
    Co do Case, to wydaje mi się to takim przerostem formy nad treścią :) ew skorzystałbym z IFNULL

  3. skowron says:

    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?

  4. Rafał Piekarski says:

    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`.

  5. zuras says:

    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.

Leave a Reply