案例基于select语句?

时间:2015-02-07 15:01:22

标签: oracle plsql case

而不是:

select count(*) into l_count from mergetest  where a = 1;

case l_count
  when 0 then
    insert into mergetest  (a,b) values (1,1);
  when 1 then
    update  mergetest  set b = b + 1 where a = 1;
  else
    NULL;
  end case;

我想摆脱局部变量l_count,而是做:

case select count(*) from mergetest where a = 1;
...

这可能吗?

3 个答案:

答案 0 :(得分:1)

不,这是不可能的。它与PL / SQL的CASE 控制结构无关,而是与PL / SQL有关。您也不能在IF语句中使用它。

所以这段代码也不会编译:

IF (SELECT COUNT(*) FROM MY_TABLE) > 0 THEN ...

请注意,如果CASE语句是SELECT(或类似SQL)语句中的表达式,则可以使用子查询:

SEELCT
  p.name,
  CASE WHEN P.TYPE_ID = 1 THEN
      (SELECT COUNT(*) FROM child c WHERE c.parent_id = p.id)
    ELSE 0
  END cnt
FROM parent p;

但是,当然,在表达式中,您不能使用诸如INSERT或UPDATE之类的语句。

答案 1 :(得分:1)

使用merge而不是case来摆脱局部变量是可能的:

merge into mergetest
  using (select 1 a from dual) ins
  on (mergetest.a = ins.a)
  when matched then 
    update set mergetest.b = mergetest.b + 1
      where (select count(1) from mergetest where mergetest.a = ins.a)  = 1
  when not matched then insert (mergetest.a, mergetest.b)
    values (ins.a, 1)

行:

      where (select count(1) from mergetest where mergetest.a = ins.a)  = 1
如果表中已存在a多次,则

会阻止更新。

答案 2 :(得分:0)

似乎无法使用PL/SQL

来自doc

  

简单CASE中CASE操作数和WHEN操作数的值   statement可以是除BLOB,BFILE之外的任何PL / SQL类型的对象   类型,PL / SQL记录,索引表,varray或嵌套表。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm

但是,您可以使用scalar subquery

select case when dummy = 'X' then (select count(*) from all_users)
else (select count(*) from dual) 
end cnt from dual

这可能会解决您的问题。