MySQL脚本的条件部分

时间:2015-11-10 20:27:57

标签: mysql

有时我会编写长查询或一系列查询,并将它们保存为SQL文件以便稍后运行。有时我会最终评论出部分查询,以便我可以获得稍微不同的结果。我想知道是否有一些机制可以直接在查询/脚本中使用来控制运行哪些代码行。这是一个非常简单的例子:

<svg id="shift"  height="40" width="85">
<defs> 
<marker id="arrowhead" markerWidth="6" markerHeight="6" refX="3" refY="0" > 
<path d="M 0 6 L 3 0 6 6" stroke="black" fill-opacity="0" rotate="90"/></marker>
</defs>
<text id="fullstring" x="0" y="15" fill="black" font-family="serif" font-size="100%">10<!--
--><tspan id="firstdec" fill="blue">.</tspan>0000<tspan id="seconddec" fill="red">.</tspan>00</text>
<path id="decarrow" stroke="black" fill="white" stroke-width="1" d=""
style="marker-end: url(#arrowhead);"/>
<script type="text/javascript"><![CDATA[
var arrowpath = document.getElementById("decarrow");
var firstdecbox = document.getElementById("firstdec").getExtentOfChar(0);
document.getElementById("fullstring").setAttribute("y",""+firstdecbox.height);
document.getElementById("shift").setAttribute("height",""+(1.4*firstdecbox.height+15));
document.getElementById("shift").setAttribute("width", ""+document.getElementById("fullstring").getComputedTextLength());
var seconddecbox = document.getElementById("seconddec").getExtentOfChar(0);
var startx = firstdecbox.x+firstdecbox.width/2;
var starty = firstdecbox.y+firstdecbox.height;
var stopx = seconddecbox.x+seconddecbox.width/2;
var stopy = seconddecbox.y+seconddecbox.height;
var bendheight = 15;
arrowpath.setAttribute("d", "M "+startx+" "+starty+" L "+ startx+" "+(starty+bendheight)+" "+stopx+" "+(stopy+bendheight)+" "+stopx+" "+stopy);
]]></script>
</svg>

附加说明 我应该提到大多数时候这些都是从MySQL Workbench运行的。虽然它可以从另一个IDE /工具运行。

ANSWER Drew和Sasha Pachev都给出了很好的答案,两者都值得一看。

  1. 存储过程
  2. 准备好的陈述

2 个答案:

答案 0 :(得分:1)

这可以通过一个小技巧来完成。使用预准备语句可以构建查询然后执行它们。考虑以下示例来开始:

set @q:=(select "select ? + 1 as n");
prepare  s from @q;
set @a:=1;
execute s using @a;

第一个语句生成一个查询(你可以将表中的表与select的结果结合起来),然后准备设置语句s,然后执行执行它替换?值为@a。

答案 1 :(得分:1)

将其卡入存储过程中。重新审视它们并进行调整。放下它们。它们可以是你想要的小沙箱。

当你使用过程和函数时,如果那么else语句就会被打开。

存储过程

drop procedure if exists doTodaysThing001;
DELIMITER $$
CREATE procedure doTodaysThing001 (IN someParam INT)
BEGIN

IF (someParam=7) then
     select "seven";
     -- ...
     -- ...
END IF;

-- some other stuff

if someParam=3 then
    select "three";
END IF;
END
$$
DELIMITER ;

测试

call doTodaysThing001(3);

另一个方面是准备语句,也可以使用concat()和绑定直接在存储过程中使用。如果您需要帮助,请询问。