SQL升級Oracle挖的Null坑,你懂的!
阿新 • • 發佈:2017-10-19
med 表名 插入 sele 數學 地址 round 排序 包括 最近公司做系統數據庫升級,主要由原來的SQL數據庫升級Oracle數據庫,對於擁有千萬級數據庫的實用系統來說,遷移不是件容易的時,光數據同步就需要很久,更別說要修改升級原來的SQL庫使用的存儲過程和視圖了。
當然經過團隊小強們的不懈努力,還是一舉攻破了這道門檻,存儲過程全部替換,數據全部同步,然,不好意思說出But,但是正是有了這個But也就有了這篇博文;
類似上訴SQL的寫法,Oracle的寫法確是這樣
select * 表名 where NVL(列名,‘‘)=‘‘
但是事實證明,Oracle這種完全模仿SQL的寫法是不能得到你想要的結果的,因為Oracle裏面 空(“)=空(“) 是false的表現;Because在Oracle中空(”)就是null;而Oracle中讓null =(等於)null 顯然,Oracle君是不同意的,至少應該是 null is null 才是正確的寫法;
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
一、定性思維
問題:我們常常在SQL的語句用這樣的查詢,不知道大家有沒有註意到: select * 表名 where isnull(列名,‘‘)=‘‘ 這種常規的寫法在SQL中應用很廣泛,只是因為在設計之初,我們做篩選的列名設置的可以為空,並且後續的數據添加過程中,可能設置了 空(‘’) 插入;所以我們篩選的時候要 包括空(‘’)和null的數據,於是就有了上述的語句;二、Oracle自帶不同
三、實例證明
滿漢全null來一遍(SQL版) 滿漢全null再來一遍(Oracle版) 大家可以比較下結果,基本上是反過來的(除了c3,c4,c5,c7),所以我不得不承認我之前可能沒有註意到這個坑,但是如今碰到了,想必也令我記憶深刻啦~~~四、總結性的侃侃
Good Luck For You!
SQL升級Oracle挖的Null坑,你懂的!