簡體   English   中英

AND / OR基於存儲過程中的變量值

[英]AND/OR based on variable value in stored procedures

我想在存儲過程中的條件之間使用AND / OR,並且決定取決於參數值,無論它是0(AND)還是1(OR)

任何人都可以幫我這個,我想這是一件容易的事,但我似乎無法弄明白。 謝謝

最簡單的方法(乍一看)是使用動態SQL連接查詢字符串,但動態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

這當然是一個非常簡單的查詢示例。
如果您有很多查詢,或者您的查詢非常復雜,這可能不是最佳解決方案,因為它會強制您復制所有查詢...但一如既往,它取決於:-)

您可以在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

如果將簡單條件的布爾結果轉換為數字( 01 ),則可以通過以下方式使用參數:

(
  (CASE WHEN condition1 THEN 1 ELSE 0 END ^ @AndOr)
  &
  (CASE WHEN condition2 THEN 1 ELSE 0 END ^ @AndOr)
) ^ @AndOr = 1

這里@AndOr是你的參數, ^是Transact-SQL按位異或運算符, &代表Transact-SQL中的按位ANDCASE表達式用於將布爾結果轉換為01

如果@AndOr = 0 (這意味着我們希望條件之間的AND ),上面的表達式可以歸結為:

case1 & case2 = 1

因為X XOR 0產率X和所謂既不單獨的值case1case2也不的整個結果&操作者不會受到所述^運算符。 因此,當@AndOr0 ,原始表達式的結果將等於condition1 AND condition2的結果。

現在,如果@AndOr = 1 (即OR ),則表達式中的每個^運算符返回其左操作數的反轉值,換句話說,否定左操作數,因為1 XOR 1 = 00 XOR 1 = 1 因此,原始表達式基本上等同於以下內容:

¬ (¬ case1 & ¬ case2) = 1

其中¬表示否定。 或者,將其轉換回布爾值,就是這樣:

NOT (NOT condition1 AND NOT condition2)

根據德摩根的一項法律

(NOT A) AND (NOT B) = NOT (A OR B)

將它應用於上述條件,我們得到:

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

因此,當@AndOr1 ,我的答案開頭給出的表達式等同於condition1 OR condition2 因此,它根據@AndOr的值預期工作。

使用input parameter您可以使用IF clause進行不同的selects

If input parameter = 0則生成AND conditions ,否則生成OR conditions

我看不出任何特別優雅的方式來做到這一點。 所以這是直截了當的方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM