2013-10-28 61 views
0

假設我有屏幕,其中用戶選擇不同的選項來對網格中數據的排序進行排序,該數據通過jQuery從數據庫異步獲取。在WHERE子句中指定要獲取所有數據而不過濾字段的關鍵字

當用戶選擇他需要查看user數據,其中status=1

SELECT * FROM user WHERE status=1; 

而同樣爲2,3,4的可變可以傳遞。

但是,當用戶沒有選擇任何東西,它應該返回所有users的結果。 所以是一個表達式或關鍵字,我可以在查詢傳遞,將得到ALL記錄,是這樣的:

SELECT * FROM user WHERE status=ANYTHING; -- EVERYTHING, ALL, ANY 

我不想寫每一個案件不同的查詢,這將不效率高,案例數量也很高,因爲上面的例子只是一個假設的例子來解釋我的情況,實際情況有點複雜。

+1

只是在不需要進行過濾的情況下包含'WHERE'子句?目前尚不清楚爲什麼你需要這樣做,這可能是因爲代碼中其他地方的設計流程。 – David

+0

列'status'是否可以爲空? –

+0

Erland Sommarskog寫了一篇關於如何做這種事情的非常好的概述 - [T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html) –

回答

3
SELECT * FROM user WHERE @status is null Or status = @status 
2

使用ISNULL()或COALESCE()函數。在參數傳遞NULL值的所有記錄,並寫出這樣的查詢

SELECT * FROM user WHERE status=ISNULL(@status,status) 

UPDATE:上面的語句將不會返回空值的記錄,因此,如果你的表有空的記錄,那麼你需要爲卡夫提到像

編寫查詢
SELECT * FROM user WHERE @status is null Or status = @status 
+2

這不一定會返回*全部*行。特別是如果'status'是可以爲空的,那麼那個列的NULL值就不會被返回。 –

+0

是的,同意,我改變了我的答案。謝謝Martin –

0

你可以提供第二個參數來查詢,以便您的where子句讀取

WHERE STATUS = @Status or @RetrieveAll=1

或許

WHERE Coalesce(STATUS, 0) = @Status or @RetrieveAll=1

+1

您的意思是「@ RetrieveAll = 1」?而且,爲什麼當你可以測試「@Status IS NULL」時有第二個參數? – GilM

+0

我把@RetrieveAll作爲一個布爾值,因此它可以是真或假。我讀這個問題的方式是,空值是一個單獨的問題,即「@Status爲空」不會返回所有行。 –

+0

@GIM - 我剛剛意識到你的意思 - 是的,你是對的。編輯我的答案 –

0

您可以使用此查詢:!

SELECT * FROM user WHERE status = '' 或status = NULL
OR
SELECT * FROM user WHERE status IN(1,2,3)//所有狀態值

相關問題