2016-05-17 84 views
4

由於某些原因,這兩個SQL語句不等效。任何人都可以幫助理解爲什麼嗎?在mySQL中IN/NOT IN的使用

SELECT N, IF(P IS NULL, 'Root', IF(N NOT IN (SELECT P FROM BST), 'Leaf', 'Inner')) 
FROM BST 
ORDER BY N; 

SELECT N, IF(P IS NULL, 'Root', IF(N IN (SELECT P FROM BST), 'Inner', 'Leaf')) 
FROM BST 
ORDER BY N; 

P.S. - 這是HackerRank上的二叉搜索樹問題。 https://www.hackerrank.com/challenges/binary-search-tree-1

+0

NOT IN(null)欺騙了許多用戶。 – jarlh

回答

2

上面的jarlh的評論是正確的,即除了測試IFNULL或'null'之外,沒有什麼比較TRUE和NULL。所以如果查詢:

(SELECT P FROM BST) 

返回單個NULL值,這兩個SQL語句將返回不同的結果。這可以很容易地與以下兩個SQL語句證明:

select if (1 in (select null), 'a', 'b') => 'b' 

select if (1 not in (select null), 'b', 'a') => 'a' 
0

沒有。當基礎表具有NULL值時,NOT IN具有奇怪的語義。在這種情況下,該子句篩選出所有行。

出於這個原因,我認爲NOT EXISTS是一個更好的選擇:

NOT EXISTS (SELECT 1 FROM BST WHERE BST.P = BST.N) 

你也可以通過添加WHERE P IS NOT NULL兩個子查詢解決這個問題。

0

聲明X IN (A,B)轉化爲X=A OR X=B。在使用OR時,只有其中一個語句需要爲TRUE才能使整個表達式成爲TRUE。如果A或B是NULL,那麼比較的一部分將等於NULL,但另一部分仍然可以得到結果。

讓我們假設B爲空,而A實際上等於X.那將是TRUE或NULL,這是TRUE。

聲明X NOT (A,B)轉換爲X<>A AND X<>B。使用AND時,所有的語句都需要爲TRUE才能使整個結果爲TRUE。如果其中一邊是NULL,則整個語句將解析爲NULL,而不是TRUE。

如果B爲空,並且X不是A,那麼您將得到TRUE或NULL,並在最後得到NULL。