sql - PLSQL Case 语句比较两列
问题描述
作为 PL/SQL 脚本的一部分,我正在努力处理 case 语句。
要求是我们有一个 ETL 作业,它运行将单行加载到带有结果的表中。此作业为不同的段返回两列,每列将读取通过或失败。这些列的结果通过电子邮件发送给负责此数据的团队。因此,如果他们都阅读“通过”,他们会收到一封电子邮件,说一切正常。如果任一列显示“失败”,他们会收到一封电子邮件,说他们需要检查数据。
当我测试这个脚本时,它根本不起作用,要么报告 SQL 命令没有正确结束,要么抛出大量 PL/SQL 错误。因为表中会有多于一行的数据,所以两个 select 子查询每个都查找最新的行,因此 MAX(LOAD_KEY) 部分。
我让这件事变得过于复杂了吗?我是不是想多了?
whenever sqlerror exit failure rollback
--
connect / as sysdba
set serverout on size 1000000
--set echo on
--
alter session set current_schema = &2;
--
--
-- executing function
--
DECLARE
RetVal Number;
--
--
-- Retrieve latest outcome records
--
BEGIN
select case
when (SELECT T4_VALIDATION_OUTCOME
FROM TABLE
WHERE LOAD_KEY = (select MAX(LOAD_KEY) from TABLE)) = 'Pass'
AND (SELECT T7_VALIDATION_OUTCOME
FROM TABLE
WHERE LOAD_KEY = (select MAX(LOAD_KEY) from TABLE)) = 'Pass'
THEN 0
ELSE 1
into RetVal
FROM TABLE;
--
if RetVal = 0 then
dbms_output.put_line('Pass'); -- T4/T7 Reconciled
ELSE
dbms_output.put_line('Fail'); -- Either T4 or T7 not reconciled
END IF;
--
END;
/
exit ```
解决方案
我认为这个查询是你想要的更简单的版本。
select
CASE
WHEN T4_VALIDATION_OUTCOME = 'Pass'
AND T7_VALIDATION_OUTCOME = 'Pass'
THEN 0
ELSE 1
END into RetVal
FROM TABLE
WHERE LOAD_KEY = (select MAX(LOAD_KEY) from TABLE);
我假设 LOAD_KEY 是一个唯一列 - 否则这可能会选择不止一行,这会引发异常。
推荐阅读
- scala - 如何在 build.sbt 中获取当前目标目录的路径
- php - 使用 mysqli 和 php (PhpMyAdmin) 检查用户名是否已存在
- python - 防止服务器关闭套接字?
- javascript - Electron:如何以pdf格式打印所有html内容
- python - Pandas .to_sql 函数抛出 ImportError(DLL 加载失败)
- python - 通过并行 Python 执行 Fortran 子程序无法执行
- javascript - Jsf Datatable jQuery 选择的索引返回 Object 作为值
- c# - 查找包含至少一个字符串单词的记录
- laravel - 找不到类“Michielfb\Time”
- angular - 角度依赖注入无法解决库组件