我有一个表格,其中NULL是NULL
值,而不是字符串NULL:
MYCOL
--------
NULL
example
为什么这个查询没有返回NULL
行?
select * from example_so where nvl(mycol, '') = '';
''
在Oracle中仍然是NULL
,这是因为Oracle不支持空字符串,就像其他高级语言或数据库管理系统一样。
您需要使用IS NULL
或IS NOT NULL
来查找NULL/空字符串。
没有其他关系运算符可以用于NULL
,尽管它在语法上是有效的。SQLFiddle演示
必须是:
select * from example_so where mycol IS NULL
编辑:根据文档
目前,Oracle数据库将长度为零的字符值视为空值。但是,这在将来的版本中可能不再成立,Oracle建议您不要将空字符串视为null。
因为NULL = NULL
实际上是未知的。第三种状态吗?它既不是TRUE
也不是FALSE
。
Oracle认为空字符串等同于NULL。
nvl(mycol, '')
没有意义,因为你将NULL变回了NULL并再次与NULL进行比较。
SQL> WITH DATA AS(
2 SELECT 1 val, 'NULL' str FROM dual UNION ALL
3 SELECT 2, NULL str FROM dual UNION ALL
4 SELECT 3, '' str FROM dual UNION ALL
5 SELECT 4, 'some value' str FROM dual)
6 SELECT val, NVL(str, 'THIS IS NULL') FROM data WHERE str IS NULL
7 /
VAL NVL(STR,'THI
---------- ------------
2 THIS IS NULL
3 THIS IS NULL
SQL>
从example_so表中选择所有数据,其中nvl(mycol, '') = '';
nvl(mycol,'')将结果为NULL, 当您将NULL与空字符串进行比较时,它们无法进行比较。
create table t(id varchar2(2));
insert into t values (nvl(null,'')); <------ this will insert NULL
insert into t values (nvl(null,'et'));
NULL
一起使用。不过这需要非常小心谨慎。 - kmkaplanOR
会抑制索引使用。 - Lalit Kumar B