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操作與null的一點總結Null
- 對線面試官:SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析面試SQL
- 【NULL】Oracle null值介紹NullOracle
- Oracle中exists和in的效能差異Oracle
- [精選] SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析SQL
- in、exists與索引索引
- 今天測試了一下mysql的Null值MySqlNull
- Oracle replayc測試Oracle
- Oracle vs PostgreSQL,研發注意事項(12) - NULL與索引OracleSQLNull索引
- ORACLE壓力測試Oracle
- Oracle TDE加密測試Oracle加密
- undefined與null與?. ??UndefinedNull
- 面試題((A)null).fun()——java中null值的強轉面試題NullJava
- EXISTS、IN、NOT EXISTS、NOT IN(zt)
- null與indexNullIndex
- [20180928]exists與cardinality.txt
- Oracle RAC序列效能測試Oracle
- Oracle RMAN恢復測試Oracle
- Oracle logmnr簡單測試Oracle
- Oracle sqlldr工具功能測試OracleSQL
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- 小白測試系列:介面測試與效能測試的區別
- Oracle 11gRac 測試案例(三)系統測試Oracle
- Oracle 11gRac 測試案例(五)ASM功能測試OracleASM
- exists與in子查詢優化優化
- [20180808]exists and not exists.txt
- Oracle JDBC ResultSet引數測試OracleJDBC
- oracle壓力測試之orastress!OracleAST
- Oracle rman duplicate遷移測試Oracle
- oracle分割槽表的分類及測試Oracle
- 有關oracle external table的一點測試。Oracle
- Oracle 11gRac 測試案例(二)系統測試(一)Oracle
- In和exists使用及效能分析(二):exists的使用
- web測試與手機app測試的異同WebAPP
- Oralce 使用SQL中的exists 和not exists 用法詳解SQL
- mysql中null與“空值”的坑MySqlNull
- 黑盒測試、白盒測試與灰盒測試方法
- oracle壓力測試之orabm(二)Oracle
- 使用profiler測試Oracle PL/SQL效能OracleSQL