zoukankan      html  css  js  c++  java
  • SQL升级Oracle挖的Null坑,你懂的!

      最近公司做系统数据库升级,主要由原来的SQL数据库升级Oracle数据库,对于拥有千万级数据库的实用系统来说,迁移不是件容易的时,光数据同步就需要很久,更别说要修改升级原来的SQL库使用的存储过程和视图了。
      当然经过团队小强们的不懈努力,还是一举攻破了这道门槛,存储过程全部替换,数据全部同步,然,不好意思说出But,但是正是有了这个But也就有了这篇博文;

    一、定性思维

    问题:我们常常在SQL的语句用这样的查询,不知道大家有没有注意到:
    select * 表名 where isnull(列名,'')=''
    这种常规的写法在SQL中应用很广泛,只是因为在设计之初,我们做筛选的列名设置的可以为空,并且后续的数据添加过程中,可能设置了 空(‘’) 插入;所以我们筛选的时候要 包括空(‘’)和null的数据,于是就有了上述的语句;

    二、Oracle自带不同

    类似上诉SQL的写法,Oracle的写法确是这样
    select * 表名 where NVL(列名,'')=''
    但是事实证明,Oracle这种完全模仿SQL的写法是不能得到你想要的结果的,因为Oracle里面 空(“)=空(“) 是false的表现;Because在Oracle中空(”)就是null;而Oracle中让null =(等于)null 显然,Oracle君是不同意的,至少应该是 null is null 才是正确的写法;

    三、实例证明

    满汉全null来一遍(SQL版)
    满汉全null再来一遍(Oracle版)
    大家可以比较下结果,基本上是反过来的(除了c3,c4,c5,c7),所以我不得不承认我之前可能没有注意到这个坑,但是如今碰到了,想必也令我记忆深刻啦~~~

    四、总结性的侃侃

    Oracle中关于null(空值)的定义(来自百度):
    1、等价于没有任何值、是未知数(这里想到了数学里最常见的 x)。 
    2、NULL与0、空字符串、空格都不同。 
    3、对空值做加、减、乘、除等运算操作,结果仍为空。 
    4、NULL的处理使用NVL函数。 
    5、比较时使用关键字用“is null”和“is not null”。 
    6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。 
    7、排序时比其他数据都大(索引默认是降序排列,小→大),所以NULL值总是排在最后。
     
    参见Oracle help 文档:
     
     

    Good Luck For You!

    莫言莫语搂起袖子敲键盘,吾信其可行则千方百计。
  • 相关阅读:
    Space for commit to queue couldn't be acquired
    数据埋点(浅谈埋点方式与上报收集)
    Hashed Indexes Geospatial Index
    线程安全 对StringBuilder抛出ArrayIndexOutOfBoundsException的探究
    [a,s]=[22,3]
    Flume-ng-sdk源码分析
    pstree
    将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collector,collector将数据汇集后,发送给kafka
    线程池 最大线程数
    es 300G 数据删除 执行计划 curl REST 操作
  • 原文地址:https://www.cnblogs.com/merlun/p/7690676.html
Copyright © 2011-2022 走看看