【问题标题】:Will be executed everything which is into parenthesis first?将首先执行括号中的所有内容吗?
【发布时间】:2016-05-27 15:17:45
【问题描述】:

我有一个这样的查询:

IF ( FALSE AND (SELECT 1 FROM mytable WHERE id = :id) ) THEN

    /* INSERT something here */

ENDIF;

我只想知道是否会执行该条件下的SELECT 语句?

如您所知,INSERT 语句永远不会运行,因为条件中有FALSEAND,所以条件始终为FALSE

现在我只想知道SELECTIF 语句之前执行?我之所以这么说是因为我听说括号中的所有内容都将首先在 MySQL 中执行。

【问题讨论】:

    标签: mysql sql parentheses


    【解决方案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)
    

    【讨论】:

    • 很好的例子,+1 .. 可以肯定的是,你的意思是 MySQL 首先评估所有其他条件,然后如果所有条件都是 TRUE 然后执行该子查询?
    • @Stack:评估是从左到右进行的,看答案的更新。
    • 我明白了,这个(FALSE AND (SELECT @out := 1) AND TRUE) 呢? @out不会变?
    【解决方案2】:

    关于您的代码:它会按照您的猜测执行。它将执行SELECT 然后评估链接到您的IF 的条件

    这种行为在许多编程语言中都很常见。如有疑问,请使用括号。

    【讨论】:

    • 我很多编程语言都使用短路,这意味着语句将被执行,因为无论查询结果如何,条件都已知为假。用实际事实来支持你的答案是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2022-11-03
    • 2022-01-18
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多