ORA-00913: 嵌套大小写的值太多

ORA-00913: too many values with a nested case

我目前正在完成第一年的任务,即使用 Oracle Apex 构建数据库,并尝试创建一个包含字段的报告以过滤显示的 table。要使用 2 个参数(在本例中为牙医预约日期和执行所述预约的工作人员)执行此操作,我使用嵌套案例来检查每个字段。我收到错误:

ORA-06550:第 6 行,第 23 列:ORA-00913:值太多。

我、我的同学和我的导师都不知道如何解决它。希望这里有人能看到我的错误。

这是我的代码:

SELECT 
CASE :P5_APPOINTMENT_DATE
    WHEN (NULL)
        THEN CASE :P5_STAFF
            WHEN (NULL)
                THEN (select
                      APPOINTMENT_ID AS "Appointment ID",
                      Patient.Surname AS "Patient Surname",
                      Patient.Forename AS "Patient Forename",
                      Staff.Surname AS "Staff Surname",
                      A_DATE AS "Date"
                      FROM Appointment
                      Inner Join Patient ON Patient.Patient_ID = Appointment.Patient_ID
                      Inner Join Staff ON Staff.Staff_ID = Appointment.Staff_ID)

                ELSE (select
                      APPOINTMENT_ID AS "Appointment ID",
                      Patient.Surname AS "Patient Surname",
                      Patient.Forename AS "Patient Forename",
                      Staff.Surname AS "Staff Surname",
                      A_DATE AS "Date"
                      FROM Appointment
                      Inner Join Patient ON Patient.Patient_ID = Appointment.Patient_ID
                      Inner Join Staff ON Staff.Staff_ID = Appointment.Staff_ID
                      Where STAFF.STAFF_ID = :P5_STAFF) 
                END 


        ELSE CASE :P5_STAFF
            WHEN (NULL)
                THEN (select
                      APPOINTMENT_ID AS "Appointment ID",
                      Patient.Surname AS "Patient Surname",
                      Patient.Forename AS "Patient Forename",
                      Staff.Surname AS "Staff Surname",
                      A_DATE AS "Date"
                      FROM Appointment
                      Inner Join Patient ON Patient.Patient_ID = Appointment.Patient_ID
                      Inner Join Staff ON Staff.Staff_ID = Appointment.Staff_ID
                      Where A_DATE = :P5_APPOINTMENT_DATE)
                ELSE (select
                      APPOINTMENT_ID AS "Appointment ID",
                      Patient.Surname AS "Patient Surname",
                      Patient.Forename AS "Patient Forename",
                      Staff.Surname AS "Staff Surname",
                      A_DATE AS "Date"
                      FROM Appointment
                      Inner Join Patient ON Patient.Patient_ID = Appointment.Patient_ID
                      Inner Join Staff ON Staff.Staff_ID = Appointment.Staff_ID
                      Where A_DATE = :P5_APPOINTMENT_DATE AND STAFF.Surname = :P5_STAFF)
                END

        END
        FROM APPOINTMENT

正如 Gordon Linoff 在评论中所说,case returns 一个值。由于大部分子查询是相同的并且您只是改变了过滤条件,因此您可以将 case 移动到 where 子句;除了这里你甚至不需要一个案例,你可以用 or 获得相同的效果,比如:

SELECT APPOINTMENT_ID AS "Appointment ID",
  Patient.Surname AS "Patient Surname",
  Patient.Forename AS "Patient Forename",
  Staff.Surname AS "Staff Surname",
  A_Date AS "Date"
FROM Appointment
JOIN Patient ON Patient.Patient_ID = Appointment.Patient_ID
JOIN Staff ON Staff.Staff_ID = Appointment.Staff_ID
WHERE (:P5_APPOINTMENT_DATE IS NULL OR A_Date = :P5_APPOINTMENT_DATE)
AND (:P5_STAFF IS NULL OR STAFF.Surname = :P5_STAFF);

如果两个绑定变量都为空,您将获得所有记录;如果其中一个或两个都不为空,那么您将获得匹配值的子集。这似乎是您想要的 - 四种可能的结果取决于设置了两个变量中的哪一个。