我有这样的疑问:
IF ( FALSE AND (SELECT 1 FROM mytable WHERE id = :id) ) THEN
/* INSERT something here */
ENDIF;我想知道的是,是否执行处于这种状态的SELECT语句?
如您所知,INSERT语句永远不会运行,因为条件中有FALSE和AND,所以条件总是FALSE。
现在我只想知道SELECT在IF-statement之前执行吗?我要说的是,因为我听说了括号中的所有内容都将首先在MySQL中执行。
发布于 2016-05-27 15:41:56
文档(MySQL ::13.3.1算子优先)没有这么说,但似乎是短路了.有必要确认这一信息。
MariaDB给出了更多细节:MariaDB ::操作员优先::短路评估。
示例:
mysql> SET @`out` := 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT (FALSE AND (SELECT @`out` := 0));
+----------------------------------+
| (FALSE AND (SELECT @`out` := 0)) |
+----------------------------------+
| 0 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @`out`;
+--------+
| @`out` |
+--------+
| 1 | -- <-- Not change
+--------+
1 row in set (0.00 sec)
mysql> SELECT (TRUE AND (SELECT @`out` := 0));
+---------------------------------+
| (TRUE AND (SELECT @`out` := 0)) |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @`out`;
+--------+
| @`out` |
+--------+
| 0 | -- <-- Change
+--------+
1 row in set (0.00 sec)更新
mysql> SET @`out` := 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT (TRUE AND (SELECT @`out` := 1) AND FALSE);
+-------------------------------------------+
| (TRUE AND (SELECT @`out` := 1) AND FALSE) |
+-------------------------------------------+
| 0 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @`out`;
+--------+
| @`out` |
+--------+
| 1 | -- <-- Change
+--------+
1 row in set (0.00 sec)发布于 2016-05-27 15:22:31
关于你的代码:它会做你想做的事情。它将执行SELECT,然后计算链接到IF的条件。
这种行为在许多编程语言中是常见的。有疑问时,使用括号。
https://stackoverflow.com/questions/37487051
复制相似问题