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)
此外,我不经常使用它,所以我不能自己写给你,但我怀疑有一种更有效的方法可以使用 UNION
s 和 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。这很酷..是吗?
我有一个存储过程如下。请注意,这只是一个示例,实际查询很长并且有很多列。
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)
此外,我不经常使用它,所以我不能自己写给你,但我怀疑有一种更有效的方法可以使用 UNION
s 和 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。这很酷..是吗?