【问题标题】:ORA-00913: too many values with a nested caseORA-00913: 嵌套大小写的值过多
【发布时间】:2015-07-18 07:35:42
【问题描述】:

我目前正在执行我的第一年任务,即使用 Oracle Apex 构建数据库,并尝试创建一个包含字段以过滤显示的表格的报告。为此,请使用 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

【问题讨论】:

  • A case 只返回一个值。您的子查询返回多个值。将您的查询改写为其他内容。或者,删除此问题并询问另一个问题,提供示例数据和所需结果以及您正在尝试做什么的描述。
  • 如果您尝试根据参数运行不同的查询,我会使用 IF/ELSE 逻辑。

标签: sql oracle oracle11g oracle-apex


【解决方案1】:

正如 Gordon Linoff 在评论中所说,case 返回单个值。由于大部分子查询是相同的并且您只是改变过滤条件,您可以将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);

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

【讨论】:

  • 如此简单但我就是看不到它,我知道使用案例有问题但我的导师没有提供替代方案非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多