1. 程式人生 > >Oracle資料庫 Null值 總結

Oracle資料庫 Null值 總結

有人總結了資料庫中Null值的概念,比較精煉,摘錄如下:
Null是資料庫中特有的資料型別,當一條記錄的某個列為Null,則表示這個列的值是未知的、是不確定的。既然是未知的,就有無數種的可能性。因此,Null並不是一個確定的值。
這是Null的由來、也是Null的基礎,所有和Null相關的操作的結果都可以從Null的概念推匯出來。
判斷一個欄位是否為Null, 應該用IS Null或IS NOT Null,而不能用‘=’。對Null的判斷只能定性,既是不是Null(IS Null/IS NOT Null),而不能定值。簡單的說,由於Null存在著無數的可能,因此兩個Null不是相等的關係,同樣也不能說兩個Null就不相等,或者比較兩個 Null的大小,這些操作都是沒有意義,得不到一個確切的答案的。因此,對Null的=、!=、>、<、>=、<=等操作的結果 都是未知的,也就算說,這些操作的結果仍然是Null。
同理,對Null進行+、-、*、/等操作的結果也是未知的,所以也是Null。
所以,很多時候會這樣總結Null,除了IS Null、IS NOT Null以外,對Null的任何操作的結果還是Null。
         Oracle 中的Null值和SQL Server 中的差不多,但是有個明顯的區別,在Oracle中空字串(‘’)被視作Null值。ORACLE允許任何一種資料型別的欄位為Null,除了以下兩種情況:
1.       主鍵欄位(primary key);
2.       定義時已經加了NOT Null限制條件的欄位
說了這麼多,我們來看一些例子。
1.       Null 比較
SQL> select 1 from dual where Null=Null;
-------------------------------------------------------------------------------
沒有查到記錄


SQL> select 1 from dual where Null='';
-------------------------------------------------------------------------------
沒有查到記錄


SQL>select 1 from dual where ''='';
-------------------------------------------------------------------------------
沒有查到記錄


SQL> select 1 from dual where Null is Null;
-------------------------------------------------------------------------------
1


SQL>select 1 from dual where '' is Null;
-------------------------------------------------------------------------------
1


SQL> select 1 from dual where nvl(Null,0)=nvl(Null,0);
-------------------------------------------------------------------------------
1
2.       Null 值運算
對空值做加、減、乘、除等運算操作,結果仍為Null。如下面的例子
SQL> select 1+Null from dual;
SQL> select 1-Null from dual;
SQL> select 1*Null from dual;
SQL> select 1/Null from dual;

查詢到一個記錄。這個記錄就是SQL語句中的那個Null
3.       Trim 陷阱
習慣寫T-SQL 程式碼的人員,容易寫出下面的錯誤程式碼:
IF v_month IS Null OR TRIM (v_month) = ''
THEN
      ;
END IF;

如果v_month 是空格串, trim後會得到Null值。
SQL>select 1 from dual where trim('    ')='';
-------------------------------------------------------------------------------
沒有查到記錄


SQL> select 1 from dual where trim('    ') is Null;
-------------------------------------------------------------------------------
1
4.       查詢中的Null值陷阱
建立下列測試表和資料:
create table cassba_Null
(
       column1          varchar2(300) not Null,
       column2          varchar2(300) Null
);

insert into cassba_Null values('1','1');
insert into cassba_Null values('2','');
commit;

共輸入2條記錄,注意第2筆記錄的 column2值為Null

進行查詢:
SQL> select * from cassba_Null where column2 like '%';
查詢到1條記錄.
結果說明:
查詢結果說明此SQL語句查詢不出列值為Null的欄位,此時需對欄位為Null的情況另外處理。

SQL> select * from cassba_Null where column2 like '%' or column2 is Null;
SQL> select * from cassba_Null where nvl(column2, '0') like '%';
查詢到2筆記錄。
5.       Oracle 中處理Null值的函式:  NVL()
語法

NVL(eExpression1, eExpression2)

引數

eExpression1, eExpression2

如果 eExpression1 的計算結果為 Null 值,則 NVL() 返回 eExpression2。如果 eExpression1 的計算結果不是 Null 值,則返回 eExpression1。eExpression1 和 eExpression2 可以是任意一種資料型別。如果 eExpression1 與 eExpression2 的結果皆為 Null 值,則 NVL( ) 返回 Null

返回值型別

字元型、日期型、日期時間型、數值型、貨幣型、邏輯型或 Null 值

說明

在不支援 Null 值或 Null 值無關緊要的情況下,可以使用 NVL( ) 來移去計算或操作中的 Null 值。

6.       總結與其它
1)       Null等價於沒有任何值、是未知數;
2)       對Null做加、減、乘、除等運算操作,結果仍為Null;
3)       Null的處理使用NVL函式 ;
4)       比較時使用關鍵字用 is Null和is not Null;
5)       Null不能被索引,所以查詢時有些符合條件的資料可能查不出來,count(?)中,用nvl(列名,0)處理後再查;
6)       排序時比其他資料都大(索引預設是升序(ASC)排列,小→大),所以Null值總是排在最後。
7)       Oracle 中空字串等同於Null值,注意Trim空格串後引起的Null值