[英]Greater than in SQL CASE statement
我很難找到比SQL語句更大的內容。
這是我的代碼:
select one, two three from orders
where case when @orderid > 0 then orders.orderid = @orderid end
@orderid是傳遞給存儲過程的參數。 我們的想法是,如果傳遞了一個有效的(> 0)orderid,那么將其用作where子句中的過濾器,否則不要全部使用它。
Guffa有正確的答案,但你使用CASE技巧(偶爾派上用場)的方式就是:
--If order ID is greater than 0, use it for selection
--otherwise return all of the orders.
select one, two, three
from orders
where orders.orderid = CASE
WHEN @orderid > 0 then @orderid
ELSE orders.orderid
END
CASE總是必須返回一些東西,所以如果你想有條件地“禁用”WHERE子句中的一個語句而不能使用OR,你可以設置等於它自己的東西,並且應該總是為真(除非比較空值) )。
編輯:我還應該說,對於這樣的查詢,其中可以返回的行數可能會有很大差異(一行對整個表),使用OPTION(RECOMPILE)提示可能有助於單行案例中的性能。
NYCDotnet回答,就像其他答案一樣有效,但它們可能不是SARGable
要進行此非SARGable查詢..
select one, two three from orders
where
case
when @orderid > 0 then orders.orderid
else 0
end = @orderid
..SARGable,改為:
select one, two three from orders
where
@orderid > 0 and orders.orderid = @orderid
or not (@orderid > 0)
如果@orderid不會變為負數,那么只需簡化解決方案:
select one, two three from orders
where
@orderid > 0 and orders.orderid = @orderid
or @orderid = 0
或者更好,即如果@orderid不會變為負數:
select one, two three from orders
where
@orderid = 0
or orders.orderid = @orderid
您不需要在這里使用CASE
。 相同的邏輯,重新安排一點:
select one, two three from orders
where @orderid is null or @orderid <= 0 or orders.orderid = @orderid
您不能將條件用作case
表達式中的值。
您可以使用or
運算符使條件不用於無效值:
select one, two, three from orders
where @orderid <= 0 or orders.orderid = @orderid
IF @orderid < 0
BEGIN
RETURN
END
SELECT one, two, three
FROM orders
WHERE orders.orderid = @orderid
事實上,因為id是一個int,如果它是一個標識列,它將始終大於零,所以你甚至不需要費心檢查@orderid是否大於零。 也就是說,上面的代碼將使查詢無法使用無效的訂單ID運行。
你也可以這樣做
SELECTone, two, three
FROM orders
WHERE orderid = @orderid AND @orderid > 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.