SQL объединяется в предложении WHERE - PullRequest
6 голосов
/ 11 марта 2009

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

SET ANSI_NULLS OFF

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

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

Когда я запускаю этот запрос, мне нужно получить обратно одну строку, потому что у одного Torres есть NULL в столбце [MiddleName]. Но запрос возвращает ноль строк. Использование IFNULL () дает тот же результат. Из исследования COALESCE у меня сложилось впечатление, что NULL будет возвращен, если все выражения будут NULL. Поскольку я не эксперт по SQL, я предполагаю, что мне чего-то не хватает, но что это .....

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

Ответы [ 4 ]

15 голосов
/ 11 марта 2009

Проблема в том, что в sql "WHERE Null = Null" никогда не вернет ни одной строки, поскольку Null не равен себе.

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

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ( @MiddleName IS NULL OR [MiddleName] = @MiddleName )
3 голосов
/ 11 марта 2009

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

Тебе нужно что-то вроде ...

SELECT * FROM [Customer]
WHERE [LastName] = 'Torres'
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL)
2 голосов
/ 11 марта 2009

Ваш COALESCE возвращает NULL, когда параметр @MiddleName и столбец MiddleName равны NULL, но тест оценивается как ложное, поскольку a NULL не равно никаким другим NULL.

Чтобы обойти это, вы должны явно проверить параметр @MiddleName на ноль:

SELECT *
FROM [Customer]
WHERE [LastName] = 'Torres'
    AND (@MiddleName IS NULL OR [MiddleName] = @MiddleName)
2 голосов
/ 11 марта 2009

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

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

Насколько я понимаю, это выглядит так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...