ANSI SQL определяет NULL как ничто не равное - даже другой экземпляр NULL. Канонический способ - использовать IS NULL
и IS NOT NULL
.
Существует также опция MS SQL Server SET ANSI_NULLS
. Отключение этой опции приводит к тому, что WHERE x = NULL
делает именно то, что вы ожидаете. Однако он также будет включать в запрос любые значения NULL
, например WHERE x <> 'abc'
, что может не соответствовать ожидаемому. Этот параметр зависит от конкретного подключения, поэтому изменение его для вашего подключения не повлияет на других. Вы также можете установить настройки по умолчанию на уровне базы данных. При создании хранимой процедуры параметр захватывается в время создания , а не время выполнения.
Еще одна хитрость заключается в создании запроса, подобного WHERE ISNULL(x, '') = ISNULL(@x, '')
. Я не думаю, что это SARGable, поэтому производительность не так хороша, как WHERE (x IS NULL AND @x IS NULL) OR (x = @x)
, но гораздо приятнее писать и динамически создавать.
Да, и, поскольку мы говорим об ANSI SQL. Версия ANSI SQL для ISNULL
: COALESCE
.