防止在IF语句中调用函数两次

时间:2013-04-07 09:59:08

标签: mysql sql database

如何阻止此函数执行两次,它会执行两次还是mysql优化它?

IF(CheckTest(node.id, 1) == 0, NULL, CheckTest(node.id, 1)) as val

问题我不能从函数本身返回NULL,因为返回值是一个VARCHAR,所以即使它是空集也会被转换回0。

3 个答案:

答案 0 :(得分:1)

set @myvar := CheckTest(node.id, 1);
select if(@myvar == 0, NULL, @myvar) as val;

答案 1 :(得分:1)

虽然我认为MySQL会对此进行优化,但您应该使用分析器来查看发生的情况。通过SQLyog或类似的方式运行查询。

还有另一种方法可以解决这种双重执行问题。

首先,创建一个临时表,并使用满足CheckTest条件的记录填充它。

然后,在主查询中,使用此表进行连接。这样,测试将对每条记录执行一次。

答案 2 :(得分:1)

正如@ joachim-isaksson指出的那样,MySql似乎没有优化它。所以你可以用这个:

SELECT
  CASE WHEN (@check:=CheckTest(node.id, 1)) = 0 THEN NULL ELSE @check END as val