我有一个要求,如果一个条件为真,我应该在查询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
希望我能解释清楚。
答案 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'