oracle sql_not exists與null的測試
除錯儲存過程時,發現產品表中許多列的值可能為null,導致not exists產生結果與所期不符
測試如下
--構建兩個同樣表結構的表
SQL> desc t_null_column;
Name Type Nullable Default Comments
---- ------- -------- ------- --------
A INTEGER Y
B INTEGER Y
C INTEGER Y
SQL> desc t_null_column_2;
Name Type Nullable Default Comments
---- ------- -------- ------- --------
A INTEGER Y
B INTEGER Y
C INTEGER Y
--b列為null
SQL> select * from t_null_column;
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
1 2
SQL> select * from t_null_column_2;
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
1 2
測試如下
--構建兩個同樣表結構的表
SQL> desc t_null_column;
Name Type Nullable Default Comments
---- ------- -------- ------- --------
A INTEGER Y
B INTEGER Y
C INTEGER Y
SQL> desc t_null_column_2;
Name Type Nullable Default Comments
---- ------- -------- ------- --------
A INTEGER Y
B INTEGER Y
C INTEGER Y
--b列為null
SQL> select * from t_null_column;
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
1 2
SQL> select * from t_null_column_2;
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
1 2
--如下sql本意是想查詢完全不在t_null_column_2表中的t_null_column表的記錄,我想的是不返回記錄才對,結果返回了記錄
SQL> select tc.* from t_null_column tc where not exists (select 1 from t_null_column_2 tc2 where tc.a=tc2.a and tc.b=tc2.b and tc.c=tc2.c);
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
1 2
--對上述的sql進行修正,對null列b進行nvl變更,這下結果符合期望
SQL> select tc.* from t_null_column tc where not exists (select 1 from t_null_column_2 tc2 where tc.a=tc2.a and nvl(tc.b,1)=nvl(tc2.b,1) and tc.c=tc2.c);
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
SQL> select tc.* from t_null_column tc where not exists (select 1 from t_null_column_2 tc2 where tc.a=tc2.a and tc.b=tc2.b and tc.c=tc2.c);
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
1 2
--對上述的sql進行修正,對null列b進行nvl變更,這下結果符合期望
SQL> select tc.* from t_null_column tc where not exists (select 1 from t_null_column_2 tc2 where tc.a=tc2.a and nvl(tc.b,1)=nvl(tc2.b,1) and tc.c=tc2.c);
A B C
--------------------------------------- --------------------------------------- ---------------------------------------
小結:1,null相當可怕,一定要深入理解,不然會犯大錯誤
2,null與null是不相等,即null=null的結果是false,而非true
2,null與null是不相等,即null=null的結果是false,而非true
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-751071/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- in,exists和not exists ,not in與null的一些關係記載Null
- in、exists操作與null的一點總結Null
- 關於ORACLE MYSQL NOT IN和NOT exists需要注意的 NULL值OracleMySqlNull
- Oracle Null 學習與測試_20091209OracleNull
- oracle in與exists 的區別Oracle
- NOT IN、JOIN、IS NULL、NOT EXISTS效率對比Null
- [Oracle] exists 和 not existsOracle
- Oracle空串與null的處理OracleNull
- oracle中的exists 和not exists 用法詳解Oracle
- Oracle約束的學習與測試Oracle
- index 包含null值得簡單測試IndexNull
- Oracle Job學習與測試Oracle
- Oracle privilege學習與測試Oracle
- Oracle Roles學習與測試Oracle
- Oracle Audit 學習與測試Oracle
- oracle中的exists和not exists和in用法詳解Oracle
- oracle中的exists理解Oracle
- 今天測試了一下mysql的Null值MySqlNull
- oracle exists and not existOracle
- exists和not exists及in和not in的用法與區別
- oracle中關於in和exists,not in 和 not existsOracle
- oracle死鎖測試與解決Oracle
- [精選] SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析SQL
- 淺談Oracle中exists與in的執行效率問題Oracle
- oracle sql tuning_in與exists的區別_轉摘OracleSQL
- [zt] Oracle RAC的Failover設定與測試OracleAI
- not null與check is not nullNull
- oracle中的nullOracleNull
- oracle 用EXISTS替代INOracle
- oracle備份與恢復測試(五)Oracle
- oracle load banlance 配置與測試方法Oracle
- Oracle DB Links學習與測試Oracle
- IN&EXISTS與NOT IN&NOT EXISTS 的優化原則的討論優化
- NOT IN 與NOT EXISTS的區別何在?
- 基於statement複製下NULL、RAND、UUID的測試NullUI
- 小白測試系列:介面測試與效能測試的區別
- 對線面試官:SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析面試SQL
- oracle中in和exists的區別Oracle