簡體   English   中英

存儲過程中“案例陳述”中的“或”條件

[英]'OR' condition in the CASE STATEMENT in stored procedure

我想知道是否有可能發生以下情況:

((CASE WHEN (a = 1 AND b = 1) OR c = 0 THEN xyz ELSE 0))

我可以看到很多用AND而不用OR編寫的CASE。

還有一件事是,需要像這樣的SELECT查詢

Select x,y,z, SUM(( CASE WHEN .....))

從表。

任何幫助將不勝感激

CREATE PROCEDURE abc
@sid int
AS
BEGIN
SELECT
  Column1,
  Column2,
  Column3,
  SUM((CASE WHEN ((a = 1 AND b != 0 ) OR (c = 720)) THEN Amount ELSE 0 END)) 
     AS total
FROM view 
WHERE sid = @sid
END

我無法對此進行測試,但是您需要執行以下操作。 可能有一種更聰明的編寫方式。

SELECT
    Column1,
    Column2,
    Column3,
    SUM(NewAmount) AS TOTAL
FROM
SELECT
    Column1,
    Column2,
    Column3,
    CASE 
        WHEN (a = 1 AND b != 0 ) OR c = 720 THEN Amount 
        ELSE 0 
    END
    AS NewAmount
FROM 
    view 
GROUP BY
    Column1,
    Column2,
    Column3

這應該工作:

Select
    Column1,
    Column2,
    Column3,
    Sum(
        Case
            When ( ( a = 1 ) And ( b != 0 ) ) Or ( c = 720 ) Then Amount 
            Else 0 
        End
    ) As total
From 
    view 
Where
    sid = ...
Group By
    Column1, Column2, Column3

如果a,b和c是數字。

如果您想要可讀的解決方案,則可以避免使用多個語句和很多圓括號。

CASE WHEN A OR B OR C THEN amount
     ELSE 0
END
<=>
CASE WHEN A THEN amount              -- this condition will be evalued first
     WHEN B THEN amount              -- second
     WHEN C THEN amount              -- and third
     ELSE 0
END

在您的情況下:

CREATE PROCEDURE abc
   @sid int
AS
BEGIN
SELECT
  Column1,
  Column2,
  Column3,
  [total] = SUM(CASE 
                   WHEN c = 720          THEN Amount
                   WHEN a = 1 AND b != 0 THEN Amount 
                   ELSE 0 
                END)  
FROM view 
WHERE sid = @sid
GROUP BY Column1, Column2, Column3
END

請注意,對於未使用聚合函數包裝的列,您需要使用GROUP BY


第二件事,我將使用用戶定義的表值函數代替存儲過程:

 CREATE FUNCTION [dbo].[abc](@sid int) RETURNS TABLE AS RETURN ( SELECT Column1, Column2, Column3, [total] = SUM(CASE WHEN c = 720 THEN Amount WHEN a = 1 AND b != 0 THEN Amount ELSE 0 END) FROM view WHERE sid = @sid GROUP BY Column1, Column2, Column3 ); 

然后,我可以使用結果集做任何我想做的事情:

 SELECT * FROM [dbo].[abc](1) WHERE Column1 = 'xxx' 

暫無
暫無

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

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