В 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;