我有这样的查询:
IF ( FALSE AND (SELECT 1 FROM mytable WHERE id = :id) ) THEN
/* INSERT something here */
ENDIF;
所有我想知道的是,SELECT
声明是否会被执行?
如您所知,INSERT
语句从未运行,因为条件中有FALSE
和AND
,因此条件始终为FALSE
。
现在我只想知道SELECT
在IF
- 声明之前执行了吗?我是这么说的,因为我听说括号中的所有内容都将首先在MySQL中执行。
答案 0 :(得分:1)
关于您的代码:它会按您的意愿执行。它将执行SELECT
,然后评估与您的IF
这种行为在很多编程语言中都很常见。如有疑问,请使用括号。
答案 1 :(得分:1)
文档(MySQL :: 13.3.1 Operator Precedence)没有说明,但似乎是短路。有必要确认这些信息。
MariaDB提供了更多详细信息:MariaDB :: Operator Precedence :: Short-circuit evaluation。
示例:
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)