Иллюстрированный самоучитель по PostgreSQL

Операторы и NULL

Если таблица содержит значения NULL, можно воспользоваться специальными операторами сравнения, чтобы учесть поля NULL при выборке или игнорировать их. Конструкция IS NULL проверяет, содержит ли поле значение NULL. Обратное условие проверяется конструкцией NOT IS NULL.

В листинге 5.15 конструкция IS NULL используется для поиска авторов, у которых отсутствуют данные в поле first_name.

Листинг 5.15. Проверка с использованием конструкции IS NULL.

booktown=# SELECT lastjiame, firstjiame
booktown-l FROM authors
booktown-* WHERE firstjiame IS NULL;
lastjiame fi rstjname
Geisel
(1 row)

При сравнении команд в листингах 5.15 и 5.16 может показаться, что эти два варианта синтаксиса идентичны. Тем не менее между ними существует принципиальное различие.

Листинг 5.16. Сравнение со значением NULL.

booktown=# SELECT lastjiame, firstjiame
booktown-l FROM authors
booktown-f WHERE firstjiame = NULL:
lastjiame | fi rstjname
Geisel |
(1 row)

В PostgreSQL условие = NULL преобразуется в IS NULL, а условие!= NULL преобразуется в IS NOT NULL. Это сделано только для совместимости с существующими клиентскими приложениями (например, Microsoft Access).

Тем не менее при сравнении значений с NULL вместо математических операторов = и != рекомендуется использовать конструкции IS NULL и NOT IS NULL. В настоящее время использование математических операторов = и != для сравнения со псевдозначениями NULL допускается ради совместимости с другими системами, но в будущем эта поддержка может быть ликвидирована, поскольку она не предусмотрена в стандарте SQL. По той же причине она не гарантирована в других СУБД на базе SQL.

Все остальные операторы сравнения для операнда NULL возвращают NULL, поскольку NULL никогда не бывает больше или меньше другой величины, отличной от NULL (листинг 5.17). NULL можно рассматривать как своего рода "черную дыру" в мире SQL – для этого псевдозначения ни один оператор сравнения (кроме IS NULL и специального оператора преобразования =) не возвращает true; NULL не может участвовать в операциях сложения, конкатенации и т. д.

Листинг 5.17. Операторы и псевдозначение NULL.

booktown=# \pset null *nu11* Null display is
booktown=# SELECT 5 > NULL;
?column?
*null*
(1 row)
booktown=# SELECT NULL IS NULL;
? column?
t (1 row)
booktown=# SELECT NULL || 'Test';?column?
*null*
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.