将IF ELSE更改为CASE

时间:2011-05-23 12:14:34

标签: mysql

我的存储过程中有以下块。它按预期工作。 但我想将其更改为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 个答案:

答案 0 :(得分: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

这保留了原始结构,但用CASE语句替换了IF THEN语句。但是,我会查看您的实际查询,看看是否有更好的方法来完成您想要做的事情。即使这是一个存储过程,执行计划也很可能是一团糟。您可能希望通过UNION ALL或其他方式来处理多个查询,以使其更加优化。对不起,我在这里无法帮助你,但这实际上取决于你的整体查询和你的数据结构。

答案 1 :(得分: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;