Oracle NULL 和空值


 

如果你工作中用到了Oracle,你必須要留意NULL和空值的處理與SQL Server上的不同.現在讓我們看些例子。

建立這張數據庫表並插入記錄

CREATE TABLE TestNull(Col2 VARCHAR(100));
INSERT INTO TestNull VALUES(NULL);
INSERT INTO TestNull VALUES('Bla');
INSERT INTO TestNull VALUES('');
INSERT INTO TestNull VALUES(' ');

如你所見我們插入了4條記錄,一條記錄是null,一條記錄是空值,一條記錄是空格,一條記錄是"Bla".

讓我們執行下面的查詢語句:

SELECT Col2,
  NVL(Col2,'EmptyOrNull') a,
  COALESCE(Col2,'EmptyOrNull') b,
  ASCII(col2) c
FROM TestNull;

下面是執行結果以html table顯示。

下面是執行結果的截圖

Oracle SQL Developer Results

 

看看發生了什么,Oracle把空值轉變成了 NULL。

我們能很容易的驗證這個猜想,建立一個有非NULL約束的單獨一列的表。

CREATE TABLE TestNull2(Col2 VARCHAR(100) NOT NULL);
現在當你想插入一個 NULL,它會報錯。
INSERT INTO TestNull2 VALUES(NULL);

這是錯誤信息
SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."TESTNULL2"."COL2")
01400. 00000 - "cannot insert NULL into (%s)"

插入"Bla"字符串沒有任何問題

INSERT INTO TestNull2 VALUES('Bla');
那么插入一個空值, 會報錯,會發生什么呢?
INSERT INTO TestNull2 VALUES('');

SQL Error: ORA-01400: cannot insert NULL into ("SYSTEM"."TESTNULL2"."COL2")
01400. 00000 - "cannot insert NULL into (%s)"

如你所見空值被轉換成NULL,你得到了和插入空值一樣的錯誤。這和SQL Server很不一樣。

 

插入一個空格會成功么?

INSERT INTO TestNull2 VALUES(' ');

插入空格沒有問題。

Coalesce函數的差別

要知道coalesce 函數工作原理不一樣. Oracle沒有isnull函數但有nvl函數來取代。

運行下面2句sql。

SELECT NVL('','No') AS a FROM dual;
SELECT COALESCE('','No') AS a FROM dual;

在這2種情況下你得到“No”返回值, 如你所見空值被當做null處理.

知道了Oralce和SQL Server的這些差別,如果你認為他們工作原理相同你會得到些奇怪的查詢結果。

 

 

1. SELECT COUNT(*) FROM DUAL WHERE '' = NULL; -- count(*)=0

2. SELECT COUNT(*) FROM DUAL WHERE '' IS NULL; -- count(*)=1

3. SELECT COUNT(*) FROM DUAL WHERE '' = ''; --count(*)=0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM