简体   繁体   English

存储过程中“案例陈述”中的“或”条件

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

I wanted to know if it is possible to have a condition like: 我想知道是否有可能发生以下情况:

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

I could see lot of CASE with AND but with no OR. 我可以看到很多用AND而不用OR编写的CASE。

And one more thing is this is need for a SELECT query like 还有一件事是,需要像这样的SELECT查询

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

from table. 从表。

Any help will be appreciated 任何帮助将不胜感激

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

I've not been able to test this, but what you need is the following. 我无法对此进行测试,但是您需要执行以下操作。 There may be a smarter way of writing this. 可能有一种更聪明的编写方式。

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

This should work: 这应该工作:

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

if a, b and c are numbers. 如果a,b和c是数字。

If you want readable solution you could avoid using multiple statement and a lot of round brackets. 如果您想要可读的解决方案,则可以避免使用多个语句和很多圆括号。

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

In your case: 在您的情况下:

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

Note that you need to use GROUP BY for columns that aren't wrapped with aggregation functions. 请注意,对于未使用聚合函数包装的列,您需要使用GROUP BY


Second thing I would use user defined table valued function instead of stored procedure: 第二件事,我将使用用户定义的表值函数代替存储过程:

 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 ); 

Then I could do whatever I want with resultset: 然后,我可以使用结果集做任何我想做的事情:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM