我正在编写一个接受名为@Vendor
的参数的存储过程。我希望查询以这种方式工作,具体取决于@Vendor
的值。
IF @Vendor IS NOT NULL
- >过滤Vendorname = @Vendor
IF @Vendor IS NULL
- >请勿在{{1}}子句
Vendorname
过滤器
醇>
我想到的策略是应用IF分支来执行同一查询的两个版本,一个使用WHERE
子句过滤器,另一个不使用。{/ p>
Vendorname WHERE
该语法可能稍微不正确,但我相信一般方法应该有效。
但是,我的问题是,是否有更简洁的方法来执行此操作,而不是再次复制相同的SQL语句?
答案 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, '')