一个 SQL 查询将在需要时多次返回同一成员

问题描述 投票:0回答:1

我的任务是编写一个 PL/SQL 查询,该查询提供成员不符合数据质量标准的错误状态。例如,如果成员的名字短了 3 个字符,CASE 语句将返回该成员“名字太短”。然后,我需要将该成员包含在下一个 CASE 语句“名字不能等于姓氏”中,然后是最终的 CASE 语句“成员低于法定工作年龄”。 按照目前的情况,如果成员第一次检查失败,那么他们就不会被包含在其他成员中。我需要我的查询可能会返回一个会员 3 次,并说明每次返回的原因。

SELECT 
  member_code,
  CASE
    WHEN LENGTH(forename) < 3 THEN 'Forename less than 3 characters'
    WHEN date_of_birth > TO_DATE('31/01/2008', 'DD/MM/YYYY') THEN 'Date of birth after 31/01/2008'
    WHEN forename = surname THEN 'Forename is equal to surname'
    ELSE 'No error'
  END AS error_status
FROM your_table_name;
oracle plsql
1个回答
0
投票

从 Oracle 12 开始,您可以使用

LATERAL
连接:

SELECT member_code,
       error_status
FROM   your_table_name
       CROSS JOIN LATERAL (
         SELECT 'Forename less than 3 characters' AS error_status,
                1 AS priority
         FROM   DUAL
         WHERE  LENGTH(forename) < 3
         UNION ALL
         SELECT 'Date of birth after 31/01/2008' AS error_status,
                1 AS priority
         FROM   DUAL
         WHERE  date_of_birth > DATE '2008-01-31'
         UNION ALL
         SELECT 'Forename is equal to surname' AS error_status,
                1 AS priority
         FROM   DUAL
         WHERE forename = surname
         UNION ALL
         SELECT 'No Error' AS error_status,
                2 AS priority
         FROM   DUAL
         ORDER BY priority
         FETCH FIRST ROW WITH TIES
       );

对于样本数据:

CREATE TABLE your_table_name (member_code, forename, surname, date_of_birth) AS
SELECT 1, 'Ng',     'Ng',     DATE '2010-01-01' FROM DUAL UNION ALL
SELECT 2, 'Thomas', 'Thomas', DATE '2008-01-01' FROM DUAL UNION ALL
SELECT 3, 'Alice',  'Abbot',  DATE '1970-01-01' FROM DUAL;

输出:

会员代码 错误_状态
1 名字少于3个字符
1 出生日期在 31/01/2008 之后
1 名字等于姓氏
2 名字等于姓氏
3 没有错误

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.