Sql ORA-00913:使用case时值过多

Sql ORA-00913:使用case时值过多,sql,oracle,oracle11g,case-when,Sql,Oracle,Oracle11g,Case When,我有一个要求,如果一个条件为真,我应该在查询Q1上执行,如果该条件失败,我应该在查询Q2上执行另一个查询。此查询结果是用户执行的搜索记录。 我对if条件使用case-when语句,因为Q1和Q2有多个列要检索,所以我得到了ORA-00913:太多的值。我了解到在检索数据时无法执行具有更多列的查询的情况。 有人能建议如何达到这种类型的要求吗 更新: 我不能给出精确的查询,但可以提供伪代码 select case when c1='1' then select c1,c2,c3 from tabl

我有一个要求,如果一个条件为真,我应该在查询Q1上执行,如果该条件失败,我应该在查询Q2上执行另一个查询。此查询结果是用户执行的搜索记录。 我对if条件使用case-when语句,因为Q1和Q2有多个列要检索,所以我得到了ORA-00913:太多的值。我了解到在检索数据时无法执行具有更多列的查询的情况。 有人能建议如何达到这种类型的要求吗

更新:

我不能给出精确的查询,但可以提供伪代码

select case when c1='1' then 
select c1,c2,c3 from table1
else select c1,c2,c3 from table2  end
from table1;
这里我给出了样本数据

表1

C1      C2     C3
1       null    1
1       2       null
表2

C1      C2     C3
1       4       1
1       3       5
2       9       null
当我运行您提供的查询时,输出如下

select
    coalesce(table2.c1, table1.c1) c1,
    coalesce(table2.c2, table1.c2) c2,
    coalesce(table2.c3, table1.c3) c3
from table1
    left outer join table2
       on (your keys here)
           and table1.c1 <> '1' -- This gets table1 if c1 = '1';
但我期待的是结果

C1    C2    C3
1     null   1
1     2      null
2     9      null
希望我解释清楚。

当您使用案例时,必须只返回一条记录-不超过1条。为了获得您想要的结果,我将使用一个左外部联接,假设您有办法将table1联接到table2,但是将您对table1.c1的检查添加到联接条件中,以便table2值仅在c1'1'时出现

此解决方案假定表1和表2相关。如果您不能将它们关联起来,那么听起来您几乎可以使用union all,其中您从表1中获取所有值,其中c1='1',并将这些值联合到表2的所有行。如有必要,如果c1为“1”,则只能包含表2的值

更新

根据您的样本数据和预期输出,请使用上面的第二个查询:

select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2 where c1 <> '1'

SQL Fiddle:

你能分享你目前拥有的代码吗?@JasonW请检查UpdateThaks,我会检查这种方法并尽快更新你给出的第一个查询,这里基于列级别而非记录级别的选择意味着,如果满足条件且表1的一列为空,它将显示表2列的数据。这不是我的要求,如果表1的数据即使在满足条件之后也没有,那么它应该显示null,反之亦然。请您建议我采取其他方法吗?我理解您的问题,即当table.c1='1'时如何获取表1的行,或者当table1.c1'1'时如何获取表2的行。我不明白你的担心。我已经为我的第一个查询设置了一个SQL FIDLE。你能告诉我这有什么问题吗?或者至少根据样本数据解释你的预期输出吗?我给出了我要求的样本数据。如果不清楚,请告诉我。
select
    coalesce(table2.c1, table1.c1) c1,
    coalesce(table2.c2, table1.c2) c2,
    coalesce(table2.c3, table1.c3) c3
from table1
    left outer join table2
       on (your keys here)
           and table1.c1 <> '1' -- This gets table1 if c1 = '1';
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2 where c1 <> '1'