簡體   English   中英

大於SQL CASE語句

[英]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.

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