我在pl/sql中有一个CASE语句不起作用,正在寻求帮助。我不是一个Oracle的人,一个SQL的人,所以不太明白为什么这不工作。在SQL中,类似于下面的东西会很好地工作,但显然在Oracle中我缺少了一些东西。
需要说明的是,我尝试根据WHEN条件执行不同的select语句。我已经在IF块中使用EXECUTE IMMEDIATE尝试过了,但也不确定这是否正确。
这是我不断得到的错误:
ORA-00937:不是单组组函数00937。00000 -“不是单组组函数”* 原因:
- 操作:错误行:186柱:42
SELECT
CASE
WHEN (COUNT(*) > 0) THEN (SELECT id from MyTable)
WHEN (COUNT(*) = 0) THEN (SELECT id from MyTable2)
END
FROM TableA TA
JOIN TableB TB ON TA.id = TB.id
JOIN TableC TC ON TB.id = TC.id
WHERE TA.id=1234;
2条答案
按热度按时间eimct9ow1#
这不是关于Oracle的编程语言PL/SQL,而是关于Oracle的SQL实现。你是对的,你的查询应该是有效的。聚合应该返回一个计数,根据计数,查询将返回MyTable的ID或MyTable 2的ID或NULL。(当然,如果MyTable或MyTable 2中有多个行,它应该在运行时崩溃。
甲骨文显然在这里有一个bug。解决方法是分两步执行此操作:对行进行计数,然后使用此结果并决定显示哪个ID。
演示:https://dbfiddle.uk/FGdQyVpu
8ljdwjyq2#
这在PL/SQL中不起作用。通常,我们计算返回的行数并将其存储到局部变量(在我的示例中为
l_cnt
)中,然后根据结果使用一个select
或另一个:它可能会有一些变化,这取决于你想对你选择的
id
做什么。注意-如果mytable
或mytable2
中的行数不等于1,您将得到一个错误(no_data_found或too_many_rows;这就是为什么我包含max
函数-以避免此类错误)。你能做什么?例如,将ID值存储到集合中。或者使用游标(
for
循环)。或者谁知道呢就像我说的,这取决于你想得到什么样的结果。这里的例子说明了你可能会做什么。
示例表是Scott的
emp
(员工):首先,count将返回 something(当deptno = 10时)并将值取入collection:
下一个示例将使用refcursor(我将修改第2行中的部门编号,这在第13行中使用):