Сравнение с NULL в SQL

В SQL нельзя в условии запроса (ON, WHERE) сравнивать с NULL. То есть

SELECT * FROM SomeTable WHERE SomeColumn != NULL;

SELECT * FROM SomeTable WHERE SomeColumn <> NULL;

SELECT * FROM SomeTable WHERE SomeColumn = NULL;

Все эти запросы не приведут к ожидающимся результатам, а именно, те строки, которые все будут равны NULL (в последнем случае) или не будут ему равны (в первых двух) не попадут в результат.

Более того, в запросе

SELECT * FROM SomeTable WHERE SomeColumn = OtherColumn;

в выдачу не попадут строки, в которых и SomeColumn, и OtherColumn равны NULL.

Для сравнения с NULL можно использовать только операторы IS NULL и IS NOT NULL.

Например, для последнего примера можно добавить дополнительное условие:

SELECT * FROM SomeTable 
WHERE SomeColumn = OtherColumn 
  OR (SomeColumn IS NULL AND OtherColumn IS NULL);

В подобных сравнениях:

expression IS TRUE

expression IS NOT TRUE

expression IS FALSE

expression IS NOT FALSE

expression IS UNKNOWN

expression IS NOT UNKNOWN

NULL выступает не как NULL, а как UNKNOWN, и все указанные выражения вернут только TRUE или FALSE, поэтому их можно использовать для сравнения с NULL, если результат вас устроит.

Например, такое выражение вернет TRUE:

select (null = '') IS NOT FALSE

PostgreSQL

В PostgreSQL есть операторы is (not) distinct from , которые следуют стандарту SQL:2003. Эти операторы позволяют сравнивать с null без лишних заморочек. Так, псевдопримеры (нерабочие) из начала статьи легко переделываются в работающие, как задумано, следующим образом:

--SELECT * FROM SomeTable WHERE SomeColumn <> NULL;

SELECT * FROM SomeTable WHERE SomeColumn IS DISTINCT FROM NULL;

--SELECT * FROM SomeTable WHERE SomeColumn = NULL;

SELECT * FROM SomeTable WHERE SomeColumn IS NOT DISTINCT FROM NULL;

 

Поделиться: Share on LinkedIn
Linkedin
Share on VK
VK
Share on Facebook
Facebook
0Tweet about this on Twitter
Twitter

Оставить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Яндекс.Метрика