我怎样才能防止这个函数执行两次,它会执行两次还是mysql对此进行优化?
IF(CheckTest(node.id, 1) == 0, NULL, CheckTest(node.id, 1)) as val
问题我不能从函数本身返回NULL,因为返回值是一个VARCHAR,所以即使它是一个空集,也会被转换回0。
set @myvar := CheckTest(node.id, 1);
select if(@myvar == 0, NULL, @myvar) as val;
虽然我认为 MySQL 会对此进行优化,但您应该使用分析器来查看发生了什么。通过 SQLyog 或类似工具运行您的查询。
还有另一种方法可以解决这种双重执行。
首先,创建一个临时表并用满足 CheckTest 条件的记录填充它。
然后,在主查询中,与该表进行连接。这样,每条记录将只执行一次测试。
正如@joachim-isaksson 所指出的,MySql 似乎没有对其进行优化。所以你可以使用这个:
SELECT
CASE WHEN (@check:=CheckTest(node.id, 1)) = 0 THEN NULL ELSE @check END as val