【问题标题】:'OR' condition in the CASE STATEMENT in stored procedure存储过程中 CASE STATEMENT 中的“或”条件
【发布时间】:2016-04-12 20:03:29
【问题描述】:

我想知道是否有可能出现以下情况:

((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

【问题讨论】:

  • 为什么不自己试试呢?它在我看来在语法上是正确的。另外请告诉我们您使用的是什么 RDBMS。
  • 我试过了,但不幸的是结果不是我所期望的。我正在使用 MSSQL
  • 请向我们展示完整的查询,以可读的方式格式化(每行前面有 4 个空格),以及您拥有的确切错误输出。
  • 看起来您只是缺少END。此外,它是一个CASE 表达式,而不是一个语句。它计算一个
  • 尝试在总计后删除逗号,将视图(保留字)放在方括号中,看来您真正的问题是您需要在查询末尾使用 GROUP BY

标签: sql sql-server tsql stored-procedures case


【解决方案1】:

我无法对此进行测试,但您需要的是以下内容。可能有一种更聪明的方式来写这个。

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

【讨论】:

    【解决方案2】:

    这应该可行:

    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 是数字。

    【讨论】:

      【解决方案3】:

      如果您想要可读的解决方案,您可以避免使用多个语句和大量圆括号。

      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 用于未使用聚合函数包装的列。


      第二件事我会使用user defined table valued function 而不是存储过程:
      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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 2014-05-29
        相关资源
        最近更新 更多