2011-05-23 77 views
1

我的存儲過程中有以下塊。它按預期工作。 但我想將其更改爲CASE,以便以後可以根據需要添加更多條件。將IF ELSE更改爲CASE

IF parm_status='ALL' THEN 
    IF op_type='CREDIT' THEN 
     set v_wherestr =concat(v_wherestr, " and (tran.operation='CREDIT')"); 
    ELSEIF op_type='UNCREDIT' THEN 
    set v_wherestr = concat(v_wherestr, " and (tran.operation='CREDIT' OR tran.operation='UNCREDIT')"); 
    END IF; 

... 
... 

END IF; 
+2

那麼你爲什麼不?什麼東西阻止你?真正的問題是什麼? – Ruben 2011-05-23 12:16:44

回答

2

基本上,這將是:

IF parm_status='ALL' THEN 
    CASE op_type 
     WHEN 'CREDIT' THEN set v_wherestr =concat(v_wherestr, " and (tran.operation='CREDIT')"); 
     WHEN 'UNCREDIT' THEN set v_wherestr = concat(v_wherestr, " and (tran.operation='CREDIT' OR tran.operation='UNCREDIT')"); 
    END; 

... 
... 

END IF; 

http://www.java2s.com/Code/SQL/Flow-Control/UseCASEWHENforstringvalue.htm

這樣可以使你原有的結構,但然後替換IF與CASE語句的語句。然而,我會看看你的實際查詢,看看是否有更完美的方式來完成你想要做的事情。儘管這是一個存儲過程,但執行計劃最可能是一團糟。你可能想要通過UNION ALL或其他東西來組合多個查詢,以使其更加優化。對不起,我無法在這裏進一步幫助您,但這取決於您的整體查詢和數據結構。

+0

這種情況是否可以像這樣的區塊運作? - 以爲這只是內聯的SQL。 – 2011-05-23 12:32:32

+0

如果IF聲明有效,我相信CASE聲明也會起作用。我試圖不再修改聲明,因爲我不確定什麼會使它變得更好,什麼會使它變得更糟。 – IAmTimCorey 2011-05-23 12:35:15

+0

我不確定這是真的:IF是T-SQL塊,Case是在線的。如果您查看示例鏈接,所有這些用法都是內聯的 - 換句話說,它們是sql語句的一部分,而不是用於塊流量控制。同樣,我不認爲IF會在內聯選擇語句中工作。 – 2011-05-23 12:53:14

2

嘗試以下操作:

IF parm_status='ALL' THEN 
    set v_wherestr = 
     CASE op_type 
      WHEN 'CREDIT' THEN concat(v_wherestr, " and (tran.operation='CREDIT')"); 
      WHEN 'UNCREDIT' THEN concat(v_wherestr, " and (tran.operation='CREDIT' OR tran.operation='UNCREDIT')"); 
     END; 

... ... 

END IF; 

甚至(這是不太靈活):

IF parm_status='ALL' THEN 
    set v_wherestr = concat(v_wherestr, 
     CASE op_type 
      WHEN 'CREDIT' THEN " and (tran.operation='CREDIT')" 
      WHEN 'UNCREDIT' THEN " and (tran.operation='CREDIT' OR tran.operation='UNCREDIT')" 
     END; 
    ); 
... ... 

END IF;