Операторы и 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)