2011-04-22 134 views
-1

在一個SQL查詢,包含SQL:哪裏MYID = ANY?

... WHERE MYID = @1 .... 

我要管理2案件
1)有一個列過濾器,@ 1將是一個數(1,2,X ...)

2)該列沒有過濾器,@ 1將是...? (任何

是否有這樣的「任何」(SQL Server 2005)?

PS。
顯然,我明白我可以刪除「在哪裏」。

PPS。
爲了更好的理解,我給自己解釋一下:我在代碼中有這個查詢,並且想要在過濾器打開時傳遞一個整數作爲參數,而當我的過濾器關閉時傳遞「something」。如果該列沒有過濾

if (filterOn) 
    GetFoos(fooID); 
else 
    GetFoos("ANY"); 

GetFoos(param1): "select * from FOOS where FOOID = {0}", param1 
+0

爲什麼你不只是執行2分離而查詢。根據@ 1值選擇一個。 – zerkms 2011-04-22 10:44:57

回答

0

"select * from FOO where FOOID = {0}", param 

使用PARAM = 「FOOID」 時,有沒有參數去篩選,這會給

select * from FOO where FOOID = FOOID // removing the filter 
0

只需刪除其中或和條款。

+0

這不是問題 – serhio 2011-04-22 10:45:37

0

如果您不想在特定列上過濾,則不要過濾該列。取下WHERE MYID =完全

+0

我有一個字符串查詢。有沒有可能保持它是,但只是取代某些東西,而不是「任何」? – serhio 2011-04-22 10:47:07

+0

如果你使用'LIKE'而不是'=',那麼我認爲你可以使用'WHERE MYID LIKE%'來匹配任何東西。編輯:並且'在哪裏MYID像42'將仍然只匹配42。 – jstanley 2011-04-22 10:48:23

+0

@serhio:你在哪裏執行此查詢?一些編程語言或存儲過程? – zerkms 2011-04-22 10:48:37

2

使兩個報表的UNION ALL

SELECT * 
FROM mytable 
WHERE myid = @col 
UNION ALL 
SELECT * 
FROM mytable 
WHERE @col IS NULL 

或只是在一個存儲過程的IF/ELSE塊分割。

無論採用哪種方式,優化程序都可以單獨優化查詢,完全忽略其中的一個,具體取決於@col的值。

+0

謝謝。我添加了一個詳細的解釋 – serhio 2011-04-22 11:03:38

+0

@serhio:只傳遞NULL而不是ANY。 – Quassnoi 2011-04-22 11:14:18

1

你可以做一些沿着這條線:

where (myid = @id or @id is null) 

所以當@id包含一個值,當它是null不是你只會過濾。

+0

這樣的表現會懲罰這種情況,當**有一個特定的'@ id'來查找時,請參閱這裏http://www.sommarskog.se/dyn-search-2005.html – 2011-04-22 10:55:18

+0

@serhio:ID列不應該爲空,但參數可能是,表示你不想過濾它。或者你可以使用值0來表示「不過濾」。 – 2011-04-22 10:57:19

+0

好的,我明白了。現在認爲這不是一個過程,但是一個SQL字符串就像'select * from FOOS where FOOID = {0}'... – serhio 2011-04-22 11:01:31