1. 程式人生 > >SQL升級Oracle挖的Null坑,你懂的!

SQL升級Oracle挖的Null坑,你懂的!

med 表名 插入 sele 數學 地址 round 排序 包括

  最近公司做系統數據庫升級,主要由原來的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 文檔: 技術分享 技術分享 技術分享 技術分享 Oracle幫助文檔地址:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm

Good Luck For You!

SQL升級Oracle挖的Null坑,你懂的!