Sql server 和/或基于存储过程中的变量值

Sql server 和/或基于存储过程中的变量值,sql-server,stored-procedures,Sql Server,Stored Procedures,我想在存储过程中的条件之间使用AND/OR,决定取决于参数值是0(AND)还是1(OR) 有人能帮我吗?我想这是一件容易的事,但我似乎不明白。谢谢(乍一看,最简单的方法是使用动态SQL连接查询字符串,但是动态SQL有它的问题。 有关详细说明,请参阅 因此,我会尽量避免使用动态SQL,如果您的查询不太复杂,这也没什么大不了的。 最简单的方法是根据参数值触发两个不同的查询: CREATE PROCEDURE spTest @AndOr bit AS BEGIN if @AndOr

我想在存储过程中的条件之间使用AND/OR,决定取决于参数值是0(AND)还是1(OR)

有人能帮我吗?我想这是一件容易的事,但我似乎不明白。谢谢(乍一看,最简单的方法是使用动态SQL连接查询字符串,但是动态SQL有它的问题。
有关详细说明,请参阅

因此,我会尽量避免使用动态SQL,如果您的查询不太复杂,这也没什么大不了的。
最简单的方法是根据参数值触发两个不同的查询:

CREATE PROCEDURE spTest
    @AndOr bit
AS
BEGIN

    if @AndOr = 0 begin 

        select * from YourTable where foo = 1 and bar = 2

    end
    else begin

        select * from YourTable where foo = 1 or bar = 2

    end

END
这当然是一个非常简单的查询示例。

如果您有很多查询,或者如果您的查询非常复杂,这可能不是最好的解决方案,因为它会强制您复制所有查询…但一如既往,这取决于:-)

具有
输入参数
,您可以使用来进行不同的
选择


如果输入参数=0
则生成
和条件
,否则生成
或条件

我看不到任何特别优雅的方法。这是一个简单的方法

create function myfun (@parm1 int, @parm2 int, @andor int) returns int
begin
if (@andor = 0 AND  @parm1 = 99 AND @parm2 = 99) return 1
else if (@andor = 1 AND (@parm1 = 99 OR @parm2 = 99)) return 1
return 0
end
go
select dbo.myfun(99,98,0) -- AND condition should return 0
select dbo.myfun(99,98,1) -- OR condition should return 1
select dbo.myfun(98,98,0) -- AND condition should return 0
select dbo.myfun(98,98,1) -- OR condition shoujld return 0

您可以在
CASE
语句中实现您的逻辑。大概是这样的:

CREATE PROCEDURE dbo.MySP @OrAnd BIT
AS 
BEGIN
    SELECT *
    FROM MyTable
    WHERE   CASE WHEN Condition1 AND Condition2 AND @OrAnd = 0 THEN 1
            WHEN (Condition1 OR Condition2) AND @OrAnd = 1 THEN 1 ELSE 0 END = 1
END

如果将简单条件的布尔结果转换为数字结果(
0
1
),则可以按以下方式使用参数:

(
  (CASE WHEN condition1 THEN 1 ELSE 0 END ^ @AndOr)
  &
  (CASE WHEN condition2 THEN 1 ELSE 0 END ^ @AndOr)
) ^ @AndOr = 1
这里,
@和或
是您的参数,
^
是Transact-SQL按位异或运算符,
&
代表Transact-SQL中的按位和,
大小写
表达式用于将布尔结果转换为
0
1

如果
@和或=0
(这意味着我们需要
之间的条件),上述表达式实际上可以归结为:

case1 & case2 = 1
因为
XOR 0
产生
X
,所以
case1
case2
的单个值和
&
运算符的整个结果都不受
^
运算符的影响。因此,当
@和或
0
时,原始表达式的结果将等同于
条件1和条件2的结果

现在,如果
@和或=1
(即
),则表达式中的每个
^
运算符都返回其左操作数的倒过来的值,换句话说,求左操作数的反,因为
1 XOR 1=0
0 XOR 1=1
。因此,原始表达式基本上等同于以下内容:

¬ (¬ case1 & ¬ case2) = 1
其中,
表示否定。或者,将其转换回布尔值,它将是:

NOT (NOT condition1 AND NOT condition2)
据其中一位专家说,

将其应用于上述条件,我们得到:

NOT (NOT condition1 AND NOT condition2) = NOT (NOT (condition1 OR condition2)) =
= condition1 OR condition2

因此,当
@和或
1
时,我答案开头给出的表达式相当于
条件1或条件2
。因此,基于
@和或

的值,它可以像预期的那样工作。您能告诉我们到目前为止您得到了什么吗?如果列被索引,您可能最好为此执行两个单独的查询或动态SQL。
的最佳计划可能与
NOT (NOT condition1 AND NOT condition2) = NOT (NOT (condition1 OR condition2)) =
= condition1 OR condition2