SQL IN()运算符,其中包含条件

时间:2014-04-11 09:46:01

标签: sql tsql

我的桌子里面有很少的数字(甚至是空的):@states table (value int) 我需要使用明确列的WHERE子句从另一个表中进行SELECT。 此列的值必须与@states个数字中的一个匹配,或者如果@states为空,则接受所有值(例如此列没有WHERE条件)。 所以我试过这样的事情:

select *
from dbo.tbl_docs docs
where 
docs.doc_state in(iif(exists(select 1 from @states), (select value from @states), docs.doc_state))

不幸的是,iif()无法返回子查询结果数据集。我尝试了iif()和CASE的不同变体,但它并没有成功。怎么做这个条件?

3 个答案:

答案 0 :(得分:2)

左连接不会吗?

declare @statesCount int;

select @statesCount = count(1) from @states;

select 
 docs.*
from dbo.tbl_docs docs
left join @states s on docs.doc_state = s.value
where s.value is not null or @statesCount = 0;

通常,只要您的查询包含子查询,就应该停止五分钟,并仔细考虑是否真的需要一个子查询。

如果你有一台能够做到这一点的服务器,在许多情况下,首先预处理输入参数可能会更好,或者可能使用MS SQL with等构造。

答案 1 :(得分:2)

select *
from dbo.tbl_docs docs
where 
(
  (select count(*) from @states) > 0 
       AND 
   docs.doc_state in(select value from @states)
)
OR
(
  (select count(*) from @states)=0 
      AND 1=1
)

答案 2 :(得分:1)

select *
from dbo.tbl_docs docs
where exists (select 1 from @states where value = doc_state) 
or not exists (select 1 from @state)