如何阻止此函数执行两次,它会执行两次还是mysql优化它?
IF(CheckTest(node.id, 1) == 0, NULL, CheckTest(node.id, 1)) as val
问题我不能从函数本身返回NULL,因为返回值是一个VARCHAR,所以即使它是空集也会被转换回0。
答案 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