2014-02-23 109 views
0

您好我在使用IN語句一個小問題。我舉了一個例子來演示。MySQL的:使用IN子句

這裏有一個名爲Person表,其中縮寫是主鍵:

initials  firstName  surname  age 
-------------------------------------------------- 
    BT   Bill  Thomson  15 
    JS   Jack   Smith  10 
    KM   Katie  Miller  2 
    KW   Keiran  Williams  18 
    LB   Lauren  Bell   6 
    LS   Lucy  Stevens  7 

所以,如果我有這樣的查詢: SELECT * FROM WHERE人的firstName NOT IN( '法案'); 我按預期得到沒有Bill的所有行。

但是,如果我寫的:

SELECT * FROM Person WHERE firstName NOT IN(NULL); 

OR

SELECT * FROM Person WHERE firstName IN (NULL); 

它告訴我沒什麼,只是一個空集。有人可以向我解釋爲什麼? 因爲我有一個表,我需要做這樣的事情,它有NULL值,這是我的問題的一部分。

+2

與'NULL'的任何比較 - 'IS NULL'除外 - 返回false或NULL(將其視爲false) 。這適用於'in'和'not in'以及其他比較操作。 –

+0

我有點理解你在說什麼...但是如果我們拿firstName,它有{Bill},如果我們將它與{NULL}進行比較,使用{Bill} IN {NULL},那麼我明白爲什麼這是錯誤的。 我不明白爲什麼{Bill}不在{NULL}是錯誤的? – tenkii

回答

1

你似乎在尋找一些直覺而不是規則。

NULL的關鍵方面是它並不意味着「哦,我有一個值等於NULL的東西」。不,這意味着:「我有一個未知的價值」。

所以,當你說:你是說

SELECT * FROM Person WHERE firstName NOT IN (NULL); 

:是firstName不是由一個未知值的值的列表?那麼,SQL不知道。該值是未知的。它可能firstname相同。它可能是different。所以,結果是NULL。請注意,當列表中有其他不匹配的值時,這將返回NULL(基本上等於false)。當匹配值在列表中時它將返回false。

當你說:

SELECT * FROM Person WHERE firstName IN (NULL); 

的邏輯幾乎是相同的。 「firstName在由未知值組成的值列表中嗎?」那麼,SQL不知道,所以結果是NULL。請注意,當列表中有其他不匹配的值時,這將返回NULL(基本上等於false)。當匹配值位於列表中時,它將返回true,如下所示:

SELECT * FROM Person WHERE firstName IN (firstname, NULL); 
+0

感謝這個解釋真的解決了問題。 – tenkii

2

使用謂詞is not nullis null

SELECT * FROM Person WHERE firstName is not null; 

SELECT * FROM Person WHERE firstName is null; 

如果您有其他condtions使用or條款:

SELECT * FROM Person WHERE firstName is null or firstName in('Bill'); 
1

正確的語法是IS NOT NULL/IS NULL所以更改如下

SELECT * FROM Person WHERE firstName IS NOT NULL; 

SELECT * FROM Person WHERE firstName IS NULL; 

您可以閱讀Documentation here

2

IN()運營商的文檔:

  • expr IN (value,...)

    ...

    爲了符合SQL標準,IN回報NULL不僅如果在左側的表達式是NULL,而且如果找不到匹配在列表中找到並在列表中的表現之一是NULL

  • expr NOT IN (value,...)

    這是相同的爲NOT(表達式IN(值,...))

這意味着,expr IN (NULL)產量NULL。在布爾上下文中,這是FALSE。這解釋了爲什麼expr IN (NULL)不給你任何結果。

另外,NOT(NULL)(與在NOT(expr IN (NULL))中一樣)也產生NULL(因此在布爾上下文中爲FALSE)。這解釋了爲什麼expr NOT IN (NULL)不會給你任何結果。