2016-03-25 47 views
0

我目前正在学习SQL。我有一本书,我想了解一个例子,但MariaDB的无法评价它:MariaDB无法评估SELECT 1 WHERE NULL = NULL;

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; 

我也尝试添加paiousheses,但没有多大帮助。我在这里做错了什么?这个例子表明将NULL与任何其他值进行比较会给出“未知”。

回答

2

AFAIK你不能使用WHERE没有FROMSELECT 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 
+1

用于测试null的_normal_方法是'col IS NULL'或'col IS NOT NULL' –

+0

感谢@RickJames - 这是更多的SQL风格。所以我改变了它。 –

0

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

NULL values cannot be used with most comparison operators. For example, =, >, >=, <=, <, or != cannot be used, as any comparison with a NULL always returns a NULL value, never true (1) or false (0).

会注意到文档页面的例子有NULL = NULL在列列表中,在where子句不是,因为列列表将返回结果的比较,并且where子句需要一个布尔表达式。

+0

SELECT NULL = NULL;这像一个魅力。如果它是布尔表达式,WHERE 1 = 1会起作用吗? – Melon

+0

我期望'WHERE 1 = 1'工作,是的。 –

+1

'NULL'可以与'<=>'运算符进行比较。 –