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