Oracle pl/sql case 语句在 WHEN 条件下的不同 select 语句

问题描述 投票:0回答:1

我在 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;  
oracle plsql
1个回答
0
投票

这在 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
循环)。或者……谁知道呢?正如我所说,取决于您想要得到什么结果。

© www.soinside.com 2019 - 2024. All rights reserved.