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会说什么工作。在前面可以关注哪些,但是我想这样做,如果它是空的,那么基本上不会有过滤器,它会返回所有结果。 –