在存储过程参数中处理NULL

时间:2017-11-20 13:27:50

标签: sql sql-server tsql

我正在编写一个接受名为@Vendor的参数的存储过程。我希望查询以这种方式工作,具体取决于@Vendor的值。

  1. IF @Vendor IS NOT NULL - >过滤Vendorname = @Vendor

  2. IF @Vendor IS NULL - >请勿在{{1​​}}子句

  3. 中应用Vendorname过滤器

    我想到的策略是应用IF分支来执行同一查询的两个版本,一个使用WHERE子句过滤器,另一个不使用。{/ p>

    Vendorname WHERE

    该语法可能稍微不正确,但我相信一般方法应该有效。

    但是,我的问题是,是否有更简洁的方法来执行此操作,而不是再次复制相同的SQL语句?

4 个答案:

答案 0 :(得分:8)

您可以将逻辑编写为:

select *
from table
where (Vendorname = @Vendor) OR (@Vendor IS NULL)

一个警告:如果您在Vendorname上有索引,则可能不会像您的版本那样进行优化。

答案 1 :(得分:2)

select *
from table
where Vendorname = case when @Vendor is not null then @Vendor else Vendorname end;

答案 2 :(得分:1)

使用IF是正确的选择。使用“catch all”参数可能导致查询计划程序选择不当。

SQL不使用Brackets({}),它使用BEGIN和END。因此,你得到:

IF @Vendor IS NOT NULL BEGIN
    SELECT*
    FROM table
    WHERE Vendorname = @Vendor;
END ELSE BEGIN
    SELECT *
    FROM table;
END

答案 3 :(得分:1)

您可以使用的另一种解决方案:

select * from table
where isnull(Vendorname, '') = coalesce(@Vendor, Vendorname, '')