Сравнение с 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;

 

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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