К NULL
-значениям нужно привыкнуть. По идее, NULL
обозначает отсутствующее
или неизвестное значение и обрабатывается отличным от других значений
образом. Проверить значение на равенство NULL
с помощью обычных
арифметических операторов сравнения (=, < или <>) нельзя. Это отлично
иллюстрирует следующий запрос:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+
Очевидно, что от таких сравнений значащих результатов ожидать нечего.
Вместо этого нужно пользоваться операторами IS NULL
и IS NOT NULL
:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+
Отметим: в MySQL 0 или NULL
приравнивается к логическому false, а все остальное - к
true. По умолчанию значение "истина" для булевого оператора равно 1.
Именно из-за того, что при работе с NULL
действуют особые правила, в
предыдущем разделе для поиска умерших животных использовалось выражение
death IS NOT NULL
, а не death <> NULL
.
Два NULL
-значения считаются одинаковыми в GROUP BY
.
При выполнении ORDER BY
, NULL
-значения идут в первую очередь если вы выполняете
ORDER ... ASC
и в последнюю - если ORDER BY ... DESC
.
Обратите внимание, что в MySQL 4.0.2 - 4.0.10, NULL
-значения всегда возвращались в первую
очередь, вне зависимости от сортировки.
User Comments
The function 'COALESCE' can simplify working with null
values.
for example, to treat null as zero, you can use:
select COALESCE(colname,0) from table where
COALESCE(colname,0) > 1;
in a date field, i used:
ORDER BY
(coalesce(TO_DAYS(date),TO_DAYS(CURDATE()))-TO_DAYS(CURDATE()))
to treat NULL as the current date.
Use IFNULL() in your SELECT statement is make the NULL any value you wish.
IFNULL(expr1,expr2)
If expr1 is not NULL, IFNULL() returns expr1, else it returns expr2. IFNULL() returns a numeric or string value, depending on the context in which it is used:
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'
Null handling can be very counter intuitive, and could cause problems if you have an incorrect function in a delete statement that returns null
DELETE FROM my_table where field > NULL (or function returning NULL)
deletes all entries.
SELECT * FROM my_table WHERE field > NULL (or function returning NULL)
returns 0 entries!
Add your own comment.