2015-02-07 48 views
0

而不是做:基於select語句的案例?

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

這可能嗎?

回答

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之類的語句。

+0

修復:可以 - >不能 – Roland 2015-02-07 15:22:40

+0

@羅蘭:謝謝你指出。已經修復了。 – Codo 2015-02-07 15:25:07

0

現在看來似乎使用PL/SQL

從DOC

的CASE操作數的值,而不是可能的情況下操作數在簡單情況下 語句可以比其他任何PL/SQL類型BLOB,BFILE,對象 類型,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 

這可能會解決您的問題。

+0

我得到的錯誤消息: PLS-00103:出現符號「SELECT」在需要下列之一時: ( - +殼體模新不爲空<標識符> <雙引號delimited-標識符>綁定變量> 繼續avg計數當前存在的最大分鐘前的sql stddev – Roland 2015-02-07 15:10:00

+0

不,仍然錯誤 – Roland 2015-02-07 15:15:47

+0

@Roland看到新的編輯 – 2015-02-07 15:20:56

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表超過一次已經存在。

+0

是的,但代碼變得難以理解。你順便說一句回答我的其他問題: http://stackoverflow.com/questions/28382332/merge-statement-but-update-only-if-exactly-one-row-matches – Roland 2015-02-09 08:31:22