2014-04-11 87 views
-1

我有一些內部(或甚至空)數字的表:@states table (value int) 而且我需要從另一個表中用WHERE子句按確定的列進行SELECT。 此列的值必須與@states之一匹配,或者如果@states爲空,則接受所有值(如該列沒有WHERE條件)。 所以,我想是這樣的:SQL IN()內部條件的運算符

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嘗試了不同的變體,但它並不成功。如何使這種情況?

回答

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

不會左連接嗎?

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等結構。

+0

左聯接返回的所有行中的文檔。這並沒有回答這個問題。 – Paparazzi

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