比较两列的 PLSQL Case 语句
PLSQL Case Statement Comparing Two Columns
我正在努力处理作为 PL/SQL 脚本一部分的 case 语句。
要求是我们有一个 ETL 作业,该作业运行时将单行加载到 table 并显示结果。此作业 returns 两列用于不同的段,每个段将通过或失败读取。这些列的结果通过电子邮件发送给负责此数据的团队。因此,如果他们都读到“通过”,他们会收到一封电子邮件,说明一切正常。如果 任一 列显示“失败”,他们会收到一封电子邮件,告知他们需要检查数据。
当我测试此脚本时,它根本无法运行,要么报告 SQL 命令未正确结束,要么抛出大量 PL/SQL 错误。因为 table 中会有不止一行数据,所以两个 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 是一个唯一的列 - 否则这可能 select 不止一行,这会引发异常。
我正在努力处理作为 PL/SQL 脚本一部分的 case 语句。
要求是我们有一个 ETL 作业,该作业运行时将单行加载到 table 并显示结果。此作业 returns 两列用于不同的段,每个段将通过或失败读取。这些列的结果通过电子邮件发送给负责此数据的团队。因此,如果他们都读到“通过”,他们会收到一封电子邮件,说明一切正常。如果 任一 列显示“失败”,他们会收到一封电子邮件,告知他们需要检查数据。
当我测试此脚本时,它根本无法运行,要么报告 SQL 命令未正确结束,要么抛出大量 PL/SQL 错误。因为 table 中会有不止一行数据,所以两个 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 是一个唯一的列 - 否则这可能 select 不止一行,这会引发异常。