Oracle 空字元串轉換為 null
進行插入時,空字元串將轉換為 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;
2件事:
1)在插入
''
時轉換為。NULL
那是甲骨文VARCHAR2
的事情。2)
select * from test where f='';
正在嘗試 doselect * from test where f=NULL
,它沒有定義,並且不會返回任何內容,因為NULL
不喜歡相等運算符。您必須使用IS NULL
或IS 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 語言參考中找到。