Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL是否会使IF()函数短路?_Mysql_Short Circuiting - Fatal编程技术网

MySQL是否会使IF()函数短路?

MySQL是否会使IF()函数短路?,mysql,short-circuiting,Mysql,Short Circuiting,我需要从第二个表中查询数据,但前提是满足主表中的一组罕见条件: SELECT ..., IF(a AND b AND c AND (SELECT 1 FROM tableb ...)) FROM tablea ... a、 b和c条件几乎总是错误的,所以我的想法是,子查询永远不会对结果集中的大多数行执行,因此比连接快得多。但这只有在if语句短路时才会成立 是吗 感谢你们提供的帮助。在SQL analyzer中尝试一下。如果您希望安全起见,不必信任数据库以一种方式工作,也不必在新版本中更改这种行

我需要从第二个表中查询数据,但前提是满足主表中的一组罕见条件:

SELECT ..., IF(a AND b AND c AND (SELECT 1 FROM tableb ...)) FROM tablea ...
a、 b和c条件几乎总是错误的,所以我的想法是,子查询永远不会对结果集中的大多数行执行,因此比连接快得多。但这只有在if语句短路时才会成立

是吗


感谢你们提供的帮助。

在SQL analyzer中尝试一下。如果您希望安全起见,不必信任数据库以一种方式工作,也不必在新版本中更改这种行为,只需进行两次查询,然后以编程方式执行If。

答案是肯定的。 mysql查询中的IFcond、expr\u true、expr\u false短路

这里是一个测试,使用@variables来证明这一事实:

SET @var:=5;  
SELECT IF(1 = 0, (@var:=@var + 1), @var ); -- using ':=' operator to modify 'true' expr @var 
SELECT IF(1 = 1, @var, (@var:=@var + 1) ); -- using ':=' operator to modify 'false' expr @var 
SELECT @var;
所有三个SELECT查询的结果都是“5”

如果IF函数未短路,则结果将是SELECT 1中的“5”,SELECT 2中的“6”,以及最后一个SELECT@var中的“7”

这是因为在select 1中从未执行过“true”表达式,在select 2中也从未执行过false表达式

注意“:=”运算符用于修改SQL查询select、from和where子句中的@var。您可以从中获得一些非常奇特/复杂的SQL。我使用@vars在SQL查询中应用了“过程”逻辑


-Jorgenson-

在J.Jorgenson的帮助下,我想出了自己的测试用例。他的例子并没有试图在条件评估中短路,但利用他的想法,我提出了自己的测试,并验证了MySQL确实短路了IF条件检查

SET @var:=5;
SELECT IF(1 = 0 AND (@var:=10), 123, @var); #Expected output: 5
SELECT IF(1 = 1 AND (@var:=10), @var, 123); #Expected output: 10
在第二个示例中,MySQL正确地短路:@var永远不会设置为10

谢谢你的帮助J.Jorgenson

视情况而定

如果没有短路,则可以使用它来避免组_CONCAT的截断警告,例如:

set @@group_concat_max_len = 5;

select if(true or @var:=group_concat('warns if evaluated'), 'actual result', @var);
结果将是“实际结果”,但您将得到警告:

Warning (Code 1260): Row 1 was cut by GROUP_CONCAT()
这与使用不太重要的GROUP_CONCAT表达式(如distinct key)以及完全不使用IF时得到的警告相同