Aby to zrobić poprawnie, możesz chcieć rozróżnić przypadki, w których są rzeczywiste wyniki NULL
w sumowanych danych, oraz przypadek, w którym nie ma żadnych sum.
Załóżmy, że mamy następujące:
mysql> select * from t;
+----------+------+
| descr | num |
+----------+------+
| hiya | 5 |
| hi there | 10 |
| yo | NULL |
+----------+------+
Chcielibyśmy pustych sumy wynosi zero, ale sumy udziałem NULL
być NULL
. Jeden (raczej męczący) sposób to zrobić:
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t WHERE num < 'ciao')
-> AS u;
+------+
| sum |
+------+
| 0 |
+------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t)
-> AS u;
+------+
| sum |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t WHERE descr < 'namaste')
-> AS u;
+------+
| sum |
+------+
| 15 |
+------+
1 row in set (0.00 sec)
mysql> SELECT IF(has_null, NULL, total) AS sum FROM (
-> SELECT COALESCE(MAX(num IS NULL), 0) AS has_null, COALESCE(SUM(num), 0) AS total
-> FROM t WHERE descr > 'namaste')
-> AS u;
+------+
| sum |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
Być może jest lepszy sposób, o którym nie pomyślałem.
Niestety, standard SQL defines SUM
to be null when no elements are summed i MySQL nie mają wyboru, muszą przestrzegać tego standardu.
Nie przynosi to pożądanego efektu - spowoduje to również maskowanie wartości "NULL", która jest częścią samych wartości "num". –
Działa, świetne rozwiązanie – nitin