Im więcej nietypowych rzeczy programuję, tym więcej nietypowych problemów musze pokonać. Co powiecie na sumę 2 liczb, z których jedna jest wartością NULL powstałą w wyniku działania SUM() lub pochodnych, gdzie nie odnaleziono żadnego rekordu.
Badamy:
SELECT 1+2+3
>> 6
SELECT 1+2+NULL
>> NULL
SELECT COALESCE( NULL, 0 )
>> 0
Zatem analogicznie do powyższego przykładu:
UPDATE users SET user_points = user_points + COALESCE((SELECT SUM( ... ) WHERE ...), 0)
Punkty użytkownika już zawsze będą się sumowały poprawnie 🙂
Tytuł nieprawidłowy. Nie dokonujesz konwersji, tylko zwracasz coś w zastępstwie. I nie dotyczy to MySQL tylko języka SQL 😉
SQL: How to return 0 (zero) instead of NULL value when SUM is used.
Ponadto, podałeś funkcję COALESCE a nie opisałeś jej. Bardziej logicznym przykładem byłby ten pochodzący z dokumentacji:
>> SELECT COALESCE(description,short_description,'(none)’) […]
No i preferowane jest „(SELECT COALESCE(MAX(points),0) […])” 🙂 – wydaje mi się, że jest bardziej logiczne.
Bardzo sprytne 😀
Dużo prostszym i wydajniejszym rozwiązaniem jest ustalenie dla points default value 0.
No chyba, że ten NULL dla Ciebie coś oznacza…
@Łukasz, niestety, dane w zapytaniu są dodawane do wartości pola, a nie jako nowy rekord, więc każde dodanie jakiejlkowiek wartości NULL skasuje dotychczasową wartość i ustawi ją na 0, co chcemy pominąć. Jeżeli jest NULL, nie ma być dodawana żadna wartość do pola (czyli wystarczy dodać 0) i pozostawić ją niezmienioną. Stąd te komplikacje 🙂
O tym właśnie pisze. Chyba skądś te wartości bierzesz, coś sumujesz, prawda?
@Łukasz, tak. Natomiast jeżeli nie istnieją żadne rekordy spełniające warunki SUM() nie zadziała, bowiem nie można sumować wartości nieistniejących rekordów. W takim wypadku zwracana jest wartość NULL, co koliduje w późniejszym UPDATE.
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum
No tak, masz w tym racje 😉
Jakie źródło wiedzy polecasz do nauki tak zaawansowanych zapytań?
@Seba – dokumentacja MySQL? 😀
@Athlan – ciekawy art, na co dzień używam MSSQL-a gdzie używam do tego celu funkcji ISNULL, w MySQL funkcja ISNULL działa inaczej i tu właśnie przydaje się COALESCE.
W MSSQL jest ISNULL, a w MySQL IFNULL(expr1,expr2)
Ewentualnie, gdy jest potrzeba użycia większej ilości warunków można użyć:
CASE (SELECT…)
WHEN NULL THEN 0
[WHEN [NOT NULL] THEN …]
END