PLSQL Case 语句比较两列

Posted

技术标签:

【中文标题】PLSQL Case 语句比较两列【英文标题】:PLSQL Case Statement Comparing Two Columns 【发布时间】:2020-12-16 16:20:36 【问题描述】:

我正在努力将 case 语句作为 PL/SQL 脚本的一部分。

要求是我们有一个 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 ```

【问题讨论】:

请提供样本数据和期望的结果。该问题描述了一张表,但查询使用了三张表,这使得事情变得不清楚。 对不起,所有对 TABLE 的引用都是同一个表。 T4 和 T7 是同一张表上的两列。这就是为什么我认为我过于复杂了 我在代码中看到的一个明显错误是您的 CASE 表达式(您使用的是 CASE 表达式,而不是 CASE 语句)在末尾缺少必需的关键字 END,就在 into RetVal 之前。不确定这是否是唯一的错误,但很明显。 好的,在 RetVal 之前添加 END 我在运行时收到以下错误:ORA-06550: line 12, column 2: PL/SQL: ORA-00936: missing expression 【参考方案1】:

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

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

【讨论】:

以上是关于PLSQL Case 语句比较两列的主要内容,如果未能解决你的问题,请参考以下文章

使用 CASE 语句比较 3 个条件并执行语句

CASE 语句 ALIAS 比较

Oracle Decode()函数和CASE语句的比较

使用大于和小于比较搜索的 CASE 语句

比较运算符在 Case 语句中的使用

我正在使用 case 语句提取两列并将它们选择为一列