2017-08-01 98 views
0

我正在創建一個SQL Server存儲過程。這是我正在構建的一個簡單的SELECT查詢。其中一個參數是查找標誌參數。如果該參數留空,那麼SELECT應默認爲不具有WHERE子句。在SQL Server中使用條件Where子句的存儲過程

CREATE PROCEDURE sprocA 
    @flagInd int 
AS 
BEGIN 
    SELECT 
     intID, strQuestion, strAnswer, intCategory, intOrder 
    FROM 
     tblA 
    -- Right here is where I am looking for the logic of the @flagInd to be evaluated..... 
    -- if @flagInd = 1 then 'WHERE flgInd=1' 
    -- else if @flagInd=0 then 'WHERE flgInd=0' 
    -- else if @flagInd IS NULL then '' 

這只是一個簡單的查詢和簡單的我想過,不知道這是否可以被嵌套沒有完成,重寫整個SELECT語句的IF語句的一部分。

回答

3

這是可以做到這樣的:

SELECT intID, strQuestion, strAnswer, intCategory, intOrder 
FROM tblA 
WHERE flgInd = @flgInd OR @flgInd IS NULL; 

你也可以使用一個CASE表達:

SELECT intID, strQuestion, strAnswer, intCategory, intOrder 
FROM tblA 
WHERE CASE 
      WHEN flgInd = @flgInd THEN 1 
      WHEN @flgInd IS NULL THEN 1 
      ELSE 0 
     END = 1; 
+0

不知道爲什麼添加'CASE'是複雜的事情。 –

+2

@JuanCarlosOropeza因爲在很多情況下,它的第一個選項的執行計劃可能不如「CASE」表達式 – Lamak

+0

優化,第一個看起來像可以使用索引,你能詳細說明什麼情況下的執行是不同? –

-1

似乎有隻是一個一對一的映射(從參數列)那麼爲什麼不使用簡單的where條款?

CREATE PROCEDURE sprocA 
    @flagInd int 
    AS 
    BEGIN 

    SELECT intID, strQuestion, strAnswer, intCategory, intOrder 
    FROM tblA WHERE flgInd = @flagInd; 
+1

,因爲當@ @ flagInd'爲NULL時它不會返回任何結果 – Lamak

+0

謝謝Lamak,就是這樣。當@ @ flagInd'爲NULL時,它不會返回任何結果。或者如果'@ flagInd'是空白或空格或空等。 理想情況下,如果不存在'NULL'傳遞的可能性,SDSMTKyzer會說什麼工作。在前面可以關注哪些,但是我想這樣做,如果它是空的,那麼基本上不會有過濾器,它會返回所有結果。 –