if-statement - PL SQL - If 语句中的 Case When 语句?
问题描述
我需要返回一个在 2 个不同列上计算的字段“AMOUNT”。
最初有这个(我知道我可以有 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
它似乎不起作用,所以我认为可能存在语法问题。
解决方案
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 标准不是必需的,但您不应依赖隐式数据转换。
推荐阅读
- spring-boot - Spring Boot 集成测试因 MockMvc 的“没有合格的 bean”而失败
- google-cloud-platform - Microk8s(在 GCE 实例上)和 GKE 集群之间的 Istio 多集群
- amazon-web-services - 在 Airflow 中使用 AWS SES 的名称或服务未知
- javascript - JavaScript - 复制数组的项目引用
- python - 在原始代码 python、selenium、re 中替换 url 时出现错误
- linux - 如何设置我的新终端以保留以前终端的会话?
- google-apps-script - 请告诉我如何安全地在 GoogleAppScript 的属性中保存访问密钥和密钥
- html - 带有 svg 和 div 的讨厌的条带
- asp.net-core - Blazor 异常 - 当前线程未与 Dispatcher 关联。使用 InvokeAsync()
- javascript - 加载值时如何在extJS中更新网格存储数据中的值