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本意是想查询完全不在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博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-751071/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9240380/viewspace-751071/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值