[英]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
如果將簡單條件的布爾結果轉換為數字( 0
或1
),則可以通過以下方式使用參數:
(
(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中的按位AND , CASE
表達式用於將布爾結果轉換為0
或1
。
如果@AndOr = 0
(這意味着我們希望條件之間的AND
),上面的表達式可以歸結為:
case1 & case2 = 1
因為X XOR 0
產率X
和所謂既不單獨的值case1
和case2
也不的整個結果&
操作者不會受到所述^
運算符。 因此,當@AndOr
為0
,原始表達式的結果將等於condition1 AND condition2
的結果。
現在,如果@AndOr = 1
(即OR
),則表達式中的每個^
運算符返回其左操作數的反轉值,換句話說,否定左操作數,因為1 XOR 1 = 0
且0 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
因此,當@AndOr
為1
,我的答案開頭給出的表達式等同於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.