首页 > 解决方案 > 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 ```

标签: sqloracleplsqlcase

解决方案


我认为这个查询是你想要的更简单的版本。

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 是一个唯一列 - 否则这可能会选择不止一行,这会引发异常。


推荐阅读