【问题标题】:MariaDB cannot evaluate SELECT 1 WHERE NULL = NULL;MariaDB 无法评估 SELECT 1 WHERE NULL = NULL;
【发布时间】:2016-03-25 18:46:12
【问题描述】:

我目前正在学习 SQL。我有一个我试图理解的书中的例子,但 MariaDB 无法评估它:

SELECT 1
WHERE NULL = NULL
UNION
SELECT 0
WHERE NULL <> NULL;

然而,这会产生以下错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'WHERE NULL = NULL
UNION
SELECT 0
WHERE NULL <> NULL;' at line 2

我试过了:

SELECT 1;

有效。然而这不是:

SELECT 1 WHERE NULL = NULL;

我也尝试过添加括号,但这并没有太大帮助。我在这里做错了什么?这个例子是为了表明将 NULL 与任何其他值进行比较会得到“未知”。

【问题讨论】:

    标签: sql mariadb


    【解决方案1】:

    AFAIK 如果没有FROM,您将无法使用WHERESELECT 1 WHERE 1 = 1 也不起作用。

    要修复您的示例,您可以从虚拟表中进行选择:

    SELECT 1
    FROM (SELECT 'dummy_value') dummy_table
    WHERE NULL = NULL
    UNION
    SELECT 0
    FROM (SELECT 'dummy_value') dummy_table
    WHERE NULL <> NULL
    

    但了解 MySQL 行为方式的更好方法可能是

    SELECT 
        NULL = NULL,
        NULL <> NULL,
        NULL IS NULL,
        NULL IS NOT NULL,
        1 = NULL,
        1 <> NULL,
        1 IS NULL,
        1 IS NOT NULL
    

    【讨论】:

    • 测试null的正常方法是col IS NULLcol IS NOT NULL
    • 感谢@RickJames - 这是更多的 SQL 风格。所以我改变了它。
    【解决方案2】:

    这是预期的行为,根据the MariaDB docs on NULLs

    NULL 值不能与大多数比较运算符一起使用。例如,=、>、>=、

    请注意,该文档页面上的示例在列列表中包含 NULL = NULL,而不是在 where 子句中,因为列列表将返回比较结果,而 where 子句需要布尔表达式。

    【讨论】:

    • 选择空=空;这就像一个魅力。如果是布尔表达式,WHERE 1 = 1 会起作用吗?
    • NULL 可以与&lt;=&gt; 运算符进行比较。
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多