Обработка значения NULL

В синтаксисе SQL значение NULL занимает особое место - оно соответствует понятию “ничего”. Значение NULL не равно пустой строке или нулю, и эта особенность часто порождает ошибки. Рассмотрим несколько примеров:

SELECT NULL=FALSE;
SELECT NULL='';
SELECT NULL=0;
SELECT NULL=NULL;

NULL значения

Результатом всех запросов будет NULL. Это может выглядеть странно, но значение NULL не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому NULL не равно ни логическому значению FALSE, ни пустой строке, ни нулю. При сравнении NULL с любым значением будет получен результат NULL, а не FALSE и не 0. Более того, NULL не равно NULL, и это иллюстрирует последний из приведенных запросов.

Если вы работаете со столбцом, в котором могут присутствовать значения NULL, необходимо учитывать следующее: нельзя использовать запросы вида

SELECT * FROM some_table WHERE some_column = NULL;
SELECT * FROM some_table WHERE some_column != NULL;

Такие запросы не вернут ни одной строки. Используйте запросы вида

SELECT * FROM some_table WHERE some_column IS NULL;
SELECT * FROM some_table WHERE some_column IS NOT NULL;

Комментариев: 8

  1. outcoldman:

    Да ты что???
    1. Скажи про какой SQL ты говоришь!
    2. В T-SQL все может быть и по другому http://msdn.microsoft.com/ru-ru/library/ms188048.aspx - все зависит от ANSI стандарта, я думаю такое есть во множестве БД.

  2. admin:

    outcoldman, Вы невнимательны: эта заметка в категории MySQL, поэтому я здесь говорю о MySQL-диалекте. Что касается T-SQL, то здесь мы имеем дело с наследием ранних версий этого диалекта. Если SET ANSI_NULLS установлено в OFF, операторы «равно» (=) и «не равно» (<>) не следуют стандарту ISO/ANSI. Т.е любая инструкция SELECT, использующая предложение WHERE column_name = NULL, возвращает все записи со значениями NULL в столбце column_name. Любая инструкция SELECT, использующая предложение WHERE column_name <> NULL, возвращает все записи со значениями столбца, не равными NULL. Microsoft настойчиво рекомендует не использовать SET ANSI_NULLS=OFF:
    В будущей версии параметр SQL Server ANSI_NULLS всегда будет иметь значение ON, а приложения, явно присваивающие ему значение OFF, будут вызывать ошибку. Избегайте использования этой функции в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

    P.S. Я так понимаю, многие СУБД разрабатывались еще в те времена, когда никаких стандартов на SQL вообще не было. Поскольку под эти реализации уже были написаны приложения, разработчикам СУБД приходится заботиться об обратной совместимости. Вот и тянут за собой из версии в версию эти несоответствия. Думаю, и у других СУБД есть такие скелеты в шкафу :-)

  3. outcoldman:

    мне не нужно рассказывать про ANSI_NULLS, я и так про него все знаю - раз вам на него намекнул. конкретизируйте просто заголовок “Обработка значения NULL в MySQL”, я читаю статью, а не хочу бегать по тегам или рубрикам и искать к какой БД это относится.
    сюда я перешел с progg.ru, а не через какую то рубрику - потому сразу трудно разобраться к какой БД это относится.

  4. LiC:

    по-моему, тут кругом указано: “PHP, MySQL, JavaScript, AJAX, HTML и CSS”.
    кажется, вполне достаточно для “ориентировки” )))

  5. Альберт:

    полезная инфа, автору 5 балов

  6. Алексей:

    SELECT * FROM some_table WHERE some_column = ”;
    А если вот так написать прокатит?
    Интересно и смысл тогда какой если можно написать просто пустотой..
    Непонятно

  7. admin:

    А если вот так написать прокатит?
    Нет. В заметке четко сказано, что пустая строка и NULL - разные вещи:
    Значение NULL не равно пустой строке или нулю, и эта особенность часто порождает ошибки.

  8. Антоха:

    Ещё можно так:
    SELECT * FROM some_table WHERE some_column NULL;
    SELECT * FROM some_table WHERE NOT (some_column NULL);

Оставьте свой отзыв