在SQL Server中使用带有条件Where子句的存储过程

3

我正在创建一个SQL Server存储过程。这是一个简单的SELECT查询。其中一个参数是查找标志参数。如果该参数为空,则SELECT默认不包含任何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语句的一部分的情况下完成。

2个回答

9
这可以这样做:
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;

不知道你为什么要添加CASE,这会使事情变得复杂。 - Juan Carlos Oropeza
3
由于在许多情况下,第一种选项的执行计划可能不如使用“CASE”表达式更优。 - Lamak
我看不出来,第一个似乎可以使用索引,你能详细说明一下哪些情况下执行会有所不同吗? - Juan Carlos Oropeza
@JuanCarlosOropeza 我现在正在使用移动设备,但我会尝试稍后更新问题。 - Lamak
好的,告诉我。谢谢。 - Juan Carlos Oropeza
谢谢Lamak,CASE语句似乎真的起作用了,而且正是我想要的。这很有意义,执行计划也是如此。 - Keith E. Truesdell

-1

看起来只有一个参数到列的一对一映射,那为什么不使用简单的where子句呢?

   CREATE PROCEDURE sprocA
    @flagInd int
    AS 
    BEGIN

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

2
因为当 @flagIndNULL 时,它不会返回任何结果。 - Lamak
谢谢Lamak,就是这样。当@flagIndNULL时,它不会返回任何结果。或者如果@flagInd为空格或空白,则也是如此。 理想情况下,如果没有可能传递NULL,SDSMTKyzer所说的方法将起作用。这在前端上可以处理,但我希望如果它为空,那么就不会有过滤器,它将返回所有结果。 - Keith E. Truesdell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接