Oracle

Oracle 空字元串轉換為 null

  • October 6, 2016

進行插入時,空字元串將轉換為 null:

insert into test (f) values ('');

現在,有一行 f 包含一個空值。

但是,當我查詢表時,我不能使用’’:

select * from test where f='';
no rows selected

我可以使用空值:

select * from test where f is null;
____F_
NULL

所以……看來Oracle決定空字元串不能用於插入,但在執行查詢時它們仍然是空字元串。關於空字元串何時變為 null 以及何時保持為空字元串的文件在哪裡?

這說明了一切:

select NVL('','it is null') as value
from dual;

SQL小提琴

2件事:

1)在插入''時轉換為。NULL那是甲骨文VARCHAR2的事情。

2)select * from test where f='';正在嘗試 do select * from test where f=NULL,它沒有定義,並且不會返回任何內容,因為NULL不喜歡相等運算符。您必須使用IS NULLIS NOT NULL

我將補充一點,CHAR數據類型的行為不同,因為它是填充的。

Oracle 將 ’’ 和 NULL 視為相同。插入 ’’ 時,不會將 ’’ 轉換為 NULL,而只是將 ’’ 解釋為NULL與單詞 NULL 被解釋為NULL或 rtrim(‘a’,‘a’) 被解釋為 相同的方式NULL

這是使用下表和插入的展示:

drop table t1;
create table t1 (c1 varchar2(10));
insert into t1 (c1) values ('');

上面的插入為 c1 插入了一個 NULL 值。您可以按如下方式選擇該行:

SELECT c1 FROM t1;

當您添加 WHERE 子句來比較相等性並且要比較的值之一為 NULL 時,結果將始終是未知的。Unknown 將評估為 false,除非對未知值的進一步操作會產生未知值。以下所有內容均不返回任何行,因為 WHERE 子句包含無論數據如何都永遠不會為真的條件。

SELECT c1 FROM t1 WHERE c1 = '';
SELECT c1 FROM t1 WHERE c1 = NULL;
SELECT c1 FROM t1 WHERE '' = '';
SELECT c1 FROM t1 WHERE NULL = NULL;

Oracle 提供了一種特殊的語法來檢索具有空值的特定列的行—— IS NULL

SELECT c1 FROM t1 WHERE c1 IS NULL;

在某些情況下,oracle 會比較 NULLS,將它們視為等於其他 NULL 值,例如在 DECODE 語句和復合鍵中。

更多資訊可以在SQL 語言參考中找到。

引用自:https://dba.stackexchange.com/questions/49744