【问题标题】:PL SQL - Case When statement inside If statement?PL SQL - If 语句中的 Case When 语句?
【发布时间】:2021-08-12 14:36:42
【问题描述】:

我需要返回一个字段“AMOUNT”,它是根据 2 个不同的列计算得出的。

最初有这个(我知道我可以有 OR 语句,但这样更容易阅读):

CASE WHEN [condition AND condition] THEN 1
WHEN [condition AND condition] THEN 1
WHEN [condition AND condition] THEN 1
WHEN [condition AND condition] THEN 2
WHEN [condition AND condition] THEN 2
WHEN [condition AND condition] THEN 2
WHEN [condition AND condition] THEN 3
WHEN [condition AND condition] THEN 3
WHEN [condition AND condition] THEN 3
ELSE 4
END AS AMOUNT

但是,条件会根据日期列而变化。所以现在我想写一个 IF-ELSEIF-ELSE 语句中的 CASE WHEN STATMENT

IF (DATE < 01.01.2020) THEN
CASE WHEN [condition] THEN 1
WHEN [condition] THEN 1
WHEN [condition] THEN 1
WHEN [condition] THEN 2
WHEN [condition] THEN 2
WHEN [condition] THEN 2
WHEN [condition] THEN 3
WHEN [condition] THEN 3
WHEN [condition] THEN 3
ELSE 4

ELSEIF (DATE >= 01.01.2020 AND DATE <01.07.2020) THEN
CASE WHEN [condition] THEN 1
WHEN [condition] THEN 1
WHEN [condition] THEN 1
WHEN [condition] THEN 2
WHEN [condition] THEN 2
WHEN [condition] THEN 2
WHEN [condition] THEN 3
WHEN [condition] THEN 3
WHEN [condition] THEN 3
ELSE 4

ELSE
CASE WHEN [condition] THEN 1
WHEN [condition] THEN 1
WHEN [condition] THEN 1
WHEN [condition] THEN 2
WHEN [condition] THEN 2
WHEN [condition] THEN 2
WHEN [condition] THEN 3
WHEN [condition] THEN 3
WHEN [condition] THEN 3
ELSE 4

END AS AMOUNT

它似乎不起作用,所以我认为可能存在语法问题。

【问题讨论】:

  • 您是在谈论 SQL 中的 CASE 表达式 还是 PL/SQL 中的 CASE 语句 - 这是两个非常不同的东西。 (SQL中没有IF,只有PL/SQL)
  • PL/SQL中的case语句
  • 那么请向我们展示您的程序(或函数)的完整代码。正如所写的那样,这些语句对我来说真的没有意义(因为您没有将 CASE 的结果分配给变量)
  • 你可以在case语句中使用case。

标签: if-statement plsql nested case


【解决方案1】:

CASE 结构允许嵌套。所以用大写替换 IF...ELSE:

case when date < date '2020-01-01' then
     case when [condition] then 1
          when [condition] then 1
          when [condition] then 1
          when [condition] then 2
          when [condition] then 2
          when [condition] then 2
          when [condition] then 3
          when [condition] then 3
          when [condition] then 3
          else 4
     end

     when date >= date '2020-01-01' and date < date '2020-01-07'
     case when [condition] then 1
          when [condition] then 1
          when [condition] then 1
          when [condition] then 2
          when [condition] then 2
          when [condition] then 2
          when [condition] then 3
          when [condition] then 3
          when [condition] then 3
          else 4
      end 
    
    else ...  ;  

注意:您不应使用date 作为列/变量名称。虽然它不是保留字,但它是数据类型定义。使用数据类型定义作为列/变量名是不好的做法。此外,我将您的隐式日期字符串转换为显式 ISO 标准。 ISO 标准不是必需的,但您不应依赖隐式数据转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2019-08-02
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多