Oracle空字符串转换为null

kai*_*naw 9 null empty-string oracle

执行插入时,空字符串将转换为 null:

insert into test (f) values ('');
Run Code Online (Sandbox Code Playgroud)

现在,有一行 f 包含空值。

但是,当我查询表时,我不能使用 '':

select * from test where f='';
no rows selected
Run Code Online (Sandbox Code Playgroud)

我可以使用空值:

select * from test where f is null;
____F_
NULL
Run Code Online (Sandbox Code Playgroud)

所以......似乎Oracle决定不能将空字符串用于插入,但在执行查询时它们仍然是空字符串。关于空字符串何时变为空值以及何时仍为空字符串的文档在哪里?

Phi*_*lᵀᴹ 9

这说明了一切:

select NVL('','it is null') as value
from dual;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

2件事:

1)在插入''时转换为NULL。这是甲骨文的VARCHAR2事情。

2)select * from test where f='';正在尝试执行select * from test where f=NULL未定义的操作,并且不会返回任何内容,因为NULL不喜欢相等运算符。您必须使用IS NULLIS NOT NULL

我要补充的是CHAR数据类型的行为不同,因为它被填充。


Lei*_*fel 7

Oracle 将 '' 和 NULL 视为相同。插入 '' 时,没有 '' 到 NULL 的转换,只是对 '' 的解释,就像NULL单词 NULL 被解释为NULL或 rtrim('a','a') 被解释为NULL.

这是使用下表和插入的演示:

drop table t1;
create table t1 (c1 varchar2(10));
insert into t1 (c1) values ('');
Run Code Online (Sandbox Code Playgroud)

上面的插入为 c1 插入了一个 NULL 值。您可以按如下方式选择该行:

SELECT c1 FROM t1;
Run Code Online (Sandbox Code Playgroud)

当您添加 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;
Run Code Online (Sandbox Code Playgroud)

Oracle 提供了一种特殊的语法来检索具有空值的特定列的行 -- IS NULL

SELECT c1 FROM t1 WHERE c1 IS NULL;
Run Code Online (Sandbox Code Playgroud)

在某些情况下,oracle 比较 NULLS 将它们视为等于其他 NULL 值,例如在 DECODE 语句和复合键中。

更多信息可以在SQL 语言参考 中找到