1. 程式人生 > >oracle中的null

oracle中的null

1、oracle null的概述

https://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as-null?noredirect=1&lq=1

https://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings?noredirect=1&lq=1

https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements005.htm#SQLRF51083

根據官方11g文件
Oracle資料庫當前將長度為零的字元值視為null。但是,在將來的版本中,這可能不會繼續存在,Oracle建議您不要將空字串視為與空值相同。
可能的原因
val IS NOT NULL 比...更具可讀性 val != ''
無需檢查這兩個條件 val != '' and  val IS NOT NULL 

 

2、查詢空值

null 是不能用=判斷的,要用is null 或 is not null
select * from emp where name is not null

null 不支援 加減乘除,以及大小和等於的比較,否則只能為空

select * from dual where rownum != null  這個是查不出來資料的,應該用
select * from dual where rownum is not null

而對於其他函式應當測試一下用null時會返回什麼

比如 select replace('abcde','b',null) from dual; 他會返回acde ,b被替換為null,相當於刪除了源字串中的b

 

3、將空值轉換為實際值

 

3.1、coalesce


select coalesce('','cc') from dual  返回 字串cc  類似於nvl
但coalesce更好用,它支援多個引數,返回第一個不為空的值


比如
select coalesce('',null,'123') from dual  返回字串123

3.2、nvl

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm


NVL(expr1, expr2)
如果expr1為null,則NVL返回expr2。如果expr1不為null,則NVL返回expr1。
這些引數expr1和expr2可具有任何資料型別。如果它們的資料型別不同,則Oracle資料庫會隱式地將其中一個轉換為另一個。如果無法隱式轉換它們,則資料庫將返回錯誤。隱式轉換請點選官方文件

 select nvl('',1),nvl(null,2) from dual;

也可以證明 空字串也被當做null

但含有空格的字串不是空值,也不會被當做null

select nvl('     ',1) from dual;