我的桌子里面有很少的数字(甚至是空的):@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的不同变体,但它并没有成功。怎么做这个条件?
答案 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)