ORA-00913:使用大小写时的值过多

时间:2015-03-16 03:23:36

标签: sql oracle oracle11g case-when

我有一个要求,如果一个条件为真,我应该在查询Q1上执行,如果该条件失败,我应该执行另一个查询Q2。该查询结果是用户执行的搜索记录。 我在if语句的语句时使用case,因为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     4      1
1     2      5
2     9      null

但是我期待输出的是

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

1 个答案:

答案 0 :(得分:2)

当你使用case时,你必须只返回一条记录 - 不超过1.为了达到你想要的结果,我会使用左外连接(假设你有办法将table1连接到table2 ),但将table1.c1上的检查添加到连接条件中,以便只有当c1&lt;&gt;时才会出现table2值。 '1'

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';

此解决方案假定table1和table2相关。如果你无法将它们联系起来,那么听起来几乎就像你可以使用一个联合,你可以从table1获取所有值,其中c1 ='1'并将它们与所有table2行联合起来。如有必要,您只能包含table2值,如果c1&lt;&gt; '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'

SQL小提琴:http://www.sqlfiddle.com/#!4/710f0/1/0