1

我怎样才能防止这个函数执行两次,它会执行两次还是mysql对此进行优化?

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

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

4

3 回答 3

1
set @myvar := CheckTest(node.id, 1);
select if(@myvar == 0, NULL, @myvar) as val;
于 2013-04-07T10:02:51.647 回答
1

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

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

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

然后,在主查询中,与该表进行连接。这样,每条记录将只执行一次测试。

于 2013-04-07T10:06:44.810 回答
1

正如@joachim-isaksson 所指出的,MySql 似乎没有对其进行优化。所以你可以使用这个:

SELECT
  CASE WHEN (@check:=CheckTest(node.id, 1)) = 0 THEN NULL ELSE @check END as val
于 2013-04-07T10:08:29.100 回答