我有一个存储过程如下。请注意,这只是一个示例,实际查询很长,有很多列。
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
。
答案 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