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决定不能将空字符串用于插入,但在执行查询时它们仍然是空字符串。关于空字符串何时变为空值以及何时仍为空字符串的文档在哪里?
这说明了一切:
select NVL('','it is null') as value
from dual;
Run Code Online (Sandbox Code Playgroud)
2件事:
1)在插入''
时转换为NULL
。这是甲骨文的VARCHAR2
事情。
2)select * from test where f='';
正在尝试执行select * 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 ('');
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 语言参考 中找到。
归档时间: |
|
查看次数: |
45450 次 |
最近记录: |