【NULL】Where子句中=1 與!=1UNION後的結果是全集麼?——NULL小夥惹的禍

secooler發表於2010-06-09
與“NULL小夥”有關的趣聞很多,有興趣的朋友可以先看一下這個文章熱熱身。
《【問題處理】“NOT IN”與“NULL”的邂逅》(http://space.itpub.net/519536/viewspace-627169)

1.建立測試表T並初始化三條資料,注意一條資料是NULL值。
sec@ora10g> create table t (x number);

Table created.

sec@ora10g> insert into t values (1);

1 row created.

sec@ora10g> insert into t values (null);

1 row created.

sec@ora10g> insert into t values (3);

1 row created.

sec@ora10g> commit;

Commit complete.

2.檢視T表中的資料並確認T表中的總資料條數
sec@ora10g> select * from t;

         X
----------
         1

         3

sec@ora10g> select count(*) from t;

  COUNT(*)
----------
         3

沒有問題。

3.有趣的事情發生了
sec@ora10g> select count(*) from (select * from t where x = 1 union all select * from t where x != 1);

  COUNT(*)
----------
         2

按照正常的邏輯思考,對於同一張表T的x欄位等於1和不等於1的資料集合應該是全集,為什麼此時返回的記錄只有2條。

4.問題同樣處在NULL值上
sec@ora10g> select * from t where x = 1;

         X
----------
         1

sec@ora10g> select * from t where x != 1;

         X
----------
         2

對於條件“x != 1”,因為NULL是一個不確定的狀態,因此此時NULL值是不被檢索到的。

5.同樣的道理like與not like對於含有NULL值的表進行統計時,也不是全集
sec@ora10g> select count(*) from (select * from t where x like '1' union all select * from t where x not like '1');

  COUNT(*)
----------
         2

6.小結
每當出現所謂“靈異事件”時,我們需要的只是冷靜的思考,任何異常現象都可以追本溯源。
少一分浮躁,多一分實操。

Good luck.

secooler
10.06.09

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-664853/,如需轉載,請註明出處,否則將追究法律責任。

相關文章