SQL Server 2008 - игнорирование нулевых значений - PullRequest
1 голос
/ 20 сентября 2009

У меня следующий запрос (запущен в sproc):

ОБЪЯВИТЬ @BrandId уникальный идентификатор

ВЫБРАТЬ * ИЗ ПРОДУКТОВ p ГДЕ p.BrandId = @ BrandId

Мой вопрос - когда NULL передается в @BrandId, запрос (правильно) не возвращает результатов - есть ли способ заставить SQL возвращать все строк, когда NULL передается в @BrandId (без использования много утверждений IF, т. е. IF @ BrandId NULL и т. д.)? - т.е. если @BrandId = NULL, когда 'игнорировать' эту часть предложения where.

Выше приведен упрощенный пример - реальный запрос длиннее и имеет несколько переменных (например, @BrandId), которым могут быть переданы нулевые значения - и желаемое поведение заключается в том, чтобы они не ограничивали результаты запроса при передаче нулевого значения .

Спасибо!

1 Ответ

2 голосов
/ 20 сентября 2009
DECLARE @BrandId uniqueidentifier;

SELECT * FROM Products p WHERE p.BrandId = ISNULL(@BrandId, p.BrandId);

Мой единственный комментарий здесь: если у вас много продуктов, этот шаблон запроса не будет сильно оптимизирован для случая, когда BrandId равен NULL (если вы помещаете запрос в хранимую процедуру), поскольку может быть сохранен только один план. за процедуру за утверждение.

Если вы используете этот оператор в хранимом процессе и действительно заботитесь о высокой производительности (то есть, если у вас много продуктов, и вы часто выполняете этот запрос), вы должны использовать:

IF @BrandId IS NULL BEGIN
    SELECT * FROM Products p;
END ELSE BEGIN
    SELECT * FROM Products p WHERE p.BrandId = @BrandId;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...