我在 pl/sql 中有一个 CASE 语句不起作用,正在寻求帮助。 我不是一个 Oracle 人,一个 SQL 人,所以不太明白为什么这不起作用。在 SQL 中,类似于下面的内容可以正常工作,但显然在 Oracle 中我遗漏了一些东西。
需要明确的是,我正在尝试根据 WHEN 条件执行不同的选择语句。我已经在 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;
这在 PL/SQL 中不起作用。通常,我们计算返回的行数并将其存储到局部变量中(在我的示例中为
l_cnt
),然后 - 根据结果 - 使用一个 select
或另一个:
declare
l_cnt number;
begin
select count(*)
into l_cnt
from tablea ta join tableb tb on ta.id = tb.id
join tablec tc on tb.id = tc.id
where ta.id = 1234;
if l_cnt > 0 then
select max(id)
into l_id
from mytable;
elsif l_cnt = 0 then
select max(id)
into l_id
from mytable2;
end if;
end;
它可能会有所不同,具体取决于您想要对您选择的
id
执行什么操作。请注意 - 如果 mytable
或 mytable2
中的行数与 1 不同,您将收到错误(no_data_found 或 too_many_rows;这就是我包含 max
函数的原因 - 以避免此类错误)。
你到底能做什么?例如,将 ID 值存储到集合中。或者使用光标(
for
循环)。或者……谁知道呢?正如我所说,取决于您想要得到什么结果。