SQL Server:基于参数的条件

时间:2015-03-15 23:47:48

标签: sql sql-server sql-server-2008 tsql

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

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 = @disty_name参数包含值'全部'

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

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

4 个答案:

答案 0 :(得分:3)

我想我找到了答案..

步骤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,它将返回false。这很酷..是吗?

答案 1 :(得分:2)

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

答案 2 :(得分:1)

一种方法是

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

请注意,这可能无法生成最佳计划。如果您有许多这些,那么使用动态SQL运行一个表单或另一个基于检查'All'可能是一个更好的方法。

答案 3 :(得分:1)

使用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