我的任务是编写一个 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 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 | 没有错误 |