СЗЛ Коалесце в пункте ГДЕ

Я пытаюсь реализовать дополнительные параметры в сохраненной процедуре, которая у меня есть, но я столкнулся с проблемой. Вот упрощенный запрос, чтобы проиллюстрировать проблему:

SET ANSI_NULLS OFF

DECLARE @MiddleName VARCHAR(20);
SET @MiddleName = NULL;

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND [MiddleName] = COALESCE(@MiddleName, [MiddleName])

Когда я запускаю этот запрос, мне нужно получить один ряд назад, потому что один Торрес имеет NULL в столбце «MiddleName». Но запрос возвращает нулевые строки. Использование IFNULL() дает тот же результат. Из исследования COALESCE, я был под впечатлением, что NULL будет возвращен, если все выражения NULL. Поскольку я не эксперт S'L я предполагаю, что я что-то отсутствует, но то, что это ... .

Заранее спасибо за любую помощь.

Ответ на: "СЗЛ Коалесце в пункте ГДЕ"

Количество ответов:4

Вы пытаетесь это сделать?

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)

От того, что я понимаю, это выглядит как он.

Проблема в том, что в sql, "ГДЕ Null и Null" никогда не вернется никаких строк, так как Null не равен себе.

Вы должны сделать

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ( @MiddleName IS NULL OR [MiddleName] = @MiddleName )

Ваш COALESCE returns возвращает NULL when the , когда параметр @MiddleName parameter and the и MiddleName column are both колонки оба NULL, but the test will evaluate to false because , но тест будет оцениваться до ложных, потому что a NULL does not equal any other does not equal any other NULL . .

Для обхода этого следует четко протестировать параметр @MiddleName parameter for nullity: на недействительность:

SELECT *
FROM [Customer]
WHERE [LastName] = 'Torres'
    AND (@MiddleName IS NULL OR [MiddleName] = @MiddleName)

Вы заявляете, что ищете запрос для возврата строки, где поле MiddleName является NULL. К сожалению (NULL и NULL) не возвращается верно, он возвращает NULL.

Вам нужно что-то вроде ...

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)