SQL服务器:基于参数的Where条件

SQL Server : Where condition based on the parameters

我有一个存储过程如下。请注意,这只是一个示例,实际查询很长并且有很多列。

select 
    *,
    (select field_1 from table_1 where field1='xx' and disty_name = @disty_name) as field_1,
    (select field_2 from table_2 where field1='xx' and disty_name = @disty_name) as field_2,
from 
    table_xx 
where 
    disty_name = @disty_name

@disty_name 参数将传递一些值并且工作正常。

我的问题是,如果 @disty_name 参数包含值 'All'

,忽略 disty_name = @disty_name 条件的最佳和最短方法是什么

我只是想在某些情况下删除 disty_name = @disty_name 条件,因为用户想要查询所有记录而不需要 disty_name 过滤。

一种方法是

(select field_1 from table_1 
 where field1='xx' and (@disty_name = 'All' OR disty_name = @disty_name)) as field_1, 
 etc..

请注意,这可能不会生成最佳计划。如果你有很多这样的然后使用动态 SQL 到 运行 一种形式或另一种基于检查 'All') 可能是更好的方法。

使用CASE

select *,
(select field_1 from table_1 where field1='xx' and disty_name = case when @disty_name='All' then disty_name else @disty_name end) as field_1,
(select field_2 from table_2 where field1='xx' and disty_name = case when @disty_name='All' then disty_name else @disty_name end) as field_2,
from table_xx where disty_name = case when @disty_name='All' then disty_name else @disty_name end
Set @disty_name = NULLIF(@disty_name, 'All')

select *,
(select field_1 from table_1 where field1='xx' and disty_name = coalesce(@disty_name,disty_name)) as field_1,
(select field_2 from table_2 where field1='xx' and disty_name = coalesce(@disty_name,disty_name)) as field_2,
from table_xx where disty_name=coalesce(@disty_name,disty_name)

此外,我不经常使用它,所以我不能自己写给你,但我怀疑有一种更有效的方法可以使用 UNIONs 和 PIVOT.

我想我找到了答案..

第 1 步 - 在 SP 中使参数可选

@disty_name ncarchar(40) = null

然后在查询中

select *,
(select field_1 from table_1 where field1='xx' and (@disty is null or dist_name=@disty))  as field_1,
(select field_2 from table_2 where field1='xx' and (@disty is null or dist_name=@disty)) as field_2,
from table_xx where (@disty is null or dist_name=@disty)

如果您传递@disty,它将从查询中过滤掉disty 值。如果我们在参数中有 Null,它将解释为 "Null is Null" 为真。如果我们有一个参数 callrd 'xyz',它将把它解释为 xyz 为 null,这将 return false。这很酷..是吗?