ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle sql_not exists与null的测试

oracle sql_not exists与null的测试

原创 Linux操作系统 作者:wisdomone1 时间:2012-12-14 08:49:46 0 删除 编辑
调试存储过程时,发现产品表中许多列的值可能为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本意是想查询完全不在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                                   
--------------------------------------- --------------------------------------- ---------------------------------------
小结:1,null相当可怕,一定要深入理解,不然会犯大错误
     2,null与null是不相等,即null=null的结果是false,而非true                                  

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-751071/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12685417