Операторы и NULL

 

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

В листинге 5.15 конструкция IS NULL используется для поиска авторов, у которых отсутствуют данные в поле f 1 rst_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)