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

Posted

技术标签:

【中文标题】ORA-00913: 使用大小写时值太多【英文标题】:ORA-00913: too many values while using case when 【发布时间】:2015-03-16 03:23:36 【问题描述】:

我有一个要求,如果一个条件为真,我应该在查询 Q1 上执行,如果该条件失败,我应该执行另一个查询 Q2。该查询结果是用户执行的搜索记录。 我在 if 条件下使用 case when 语句,因为 Q1 和 Q2 有多个要检索的列,我得到 ORA-00913: too many values 。我开始知道在检索数据时无法执行具有更多列的查询的情况。 任何人都可以建议如何实现这种类型的要求。

更新:

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

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

希望我解释清楚。

【问题讨论】:

你能分享你目前的代码吗? @JasonW 请检查更新 【参考方案1】:

当您使用case 时,您必须只返回一条记录 - 不超过 1 条。为了达到您想要的结果,我会使用左外连接(假设您有办法将 table1 连接到 table2),但是将您对 table1.c1 的检查添加到连接条件中,以便 table2 值仅在 c1 '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 相关。如果你不能将它们联系起来,那么听起来你几乎可以使用一个 union all,在其中你从 table1 where c1 = '1' 中获取所有值并将这些值联合到所有 table2 行。如有必要,您只能在 c1 '1' 时包含 table2 值。

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

【讨论】:

谢谢,我会检查这种方法并尽快更新您 对于您给出的第一个查询,这里基于列级别而不是记录级别的选择意味着,如果满足条件并且table1的一列为null,它将显示table2列的数据。这不是我的要求,如果条件满足后table1没有数据,它应该显示null,反之亦然。 请问您能建议我做其他方法吗? 我理解你的问题是当 table.c1 = '1' 时如何获取 table1 的行,或者当 table1.c1 '1' 时如何获取 table2 的行。我不明白你的担心。我已经为我的第一个查询设置了一个 SQL 小提琴 (sqlfiddle.com/#!4/3f731/3/0)。您能否告诉我这有什么问题,或者至少根据该示例数据解释您的预期输出? 我给出了我的要求的样本数据。如果不清楚,请告诉我。

以上是关于ORA-00913: 使用大小写时值太多的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-00913:值太多 00913.00000 -“值太多”

PL/SQL: ORA-00913: 值太多

ORA-00913: oracle 子查询中的值太多

ORA-00913 值过多

ORA-00913: 值过多

Oracle插入数据报错 (ORA-00913: 值过多)