【问题标题】:Oracle CASE failing with multiple columns in Else clauseOracle CASE 失败,Else 子句中有多个列
【发布时间】:2017-01-03 16:14:22
【问题描述】:

在 Oracle 中,下面的查询在单列上运行良好,但是当我尝试放置多列时它失败了,实际上我的要求是如果特定表中没有记录及其复杂的内部查询,则退出 SQL 查询(以下是简化的问题描述),我不能使用 PL/SQL 块,请建议。

SQL> select 
         case when (select count(*) from bl1_charge_adj where rownum=1) = '1' then ( select customer_id  from customer) 
         else 44 END as ee
     from dual;

EE
----------
44

SQL> select 
         case when (select count(*) from bl1_charge_adj where rownum=1) = '1' then ( select customer_id,DL_UPDATE_STAMP from customer) 
         else (1,2) END 
     from dual

第 1 行出现错误:
ORA-00907: 缺少右括号

【问题讨论】:

  • 这是正确的。 case 是一个标量表达式,意味着它返回一个值。样本数据和期望的结果将有助于解释您想要做什么。
  • 如果查询中涉及的 4 个表之一为空,我的要求是立即退出复杂的 SQL 查询(因为我不能使用 pl/sql,所以我正在尝试使用 CASE 来实现这一点,请建议是否我还有其他方法可以使用 SQL)
  • 请不要用 cmets 澄清问题,而是编辑问题
  • edit 您的问题并添加一些示例数据和基于该数据的预期输出。 Formatted textno screen shots

标签: sql oracle


【解决方案1】:

我想你想要这样的东西:

select customer_id, DL_UPDATE_STAMP
from customer
where exists (select 1 from bl1_charge_adj)
union all
select 1, 2
from dual
where not exists (select 1 from bl1_charge_adj);

【讨论】:

  • 实际上在您的情况下select customer_id, DL_UPDATE_STAMP from customer 在任何情况下运行,如果 bl1_charge_adj 为空,我希望此客户查询根本不运行,在实际场景中,客户查询是大查询,这是不必要的消耗 CPU生产,我知道它不会在最后返回结果,因为表 bl1_charge_adj 是空的
  • @user2993724 。 . .这实际上比您的版本更有效。评估 where 子句以确定是否返回任何行。
【解决方案2】:

这应该可行:

select nvl(c.customer_id, 1), nvl(c.DL_UPDATE_STAMP, 2)
from ( select count(*) as c from bl1_charge_adj where rownum=1) d
left outer join customer c on d.c = 1;

我怀疑如果bl1_charge_adj 表很大,将count(*) 更改为其他值会更好。

【讨论】:

  • 这会有有趣的行为是customer 有超过 1 行,bl1_charge_adj 没有行。
  • 好点,我假设在某处的客户 ID 上应该有一些 where 条件,这样客户位就会返回一行。否则,原来的问题也没有意义。也许 rownum 位应该来自 count(*) 选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多