在存储过程参数中处理NULL

Ben*_*nWS 2 sql t-sql sql-server

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

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

  2. IF @Vendor IS NULL- >不要VendornameWHERE子句中应用filter

我想到的策略是应用IF分支来执行同一查询的两个版本,一个带有Vendorname WHERE子句过滤器,另一个没有.

IF (@Vendor IS NOT NULL) {
    select *
    from table
    where Vendorname = @Vendor;
} ELSE {
    select *
    from table;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Gor*_*off 8

您可以将逻辑编写为:

select *
from table
where (Vendorname = @Vendor) OR (@Vendor IS NULL)
Run Code Online (Sandbox Code Playgroud)

一个警告:如果您有索引,这可能不如您的版本优化Vendorname.

  • 简单而好的答案.但我总是喜欢将OR的所有条件放在括号内.以防万一你在以后放入AND条件并忘记括号时,你的结果可能不是你所期望的 (2认同)