2016-03-25 70 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'可以與'<=>'運算符進行比較。 –