我有这个表,其中NULL是NULL
值,而不是字符串NULL:
MYCOL
--------
NULL
example
为什么此查询不会返回NULL
行?
select * from example_so where nvl(mycol, '') = '';
答案 0 :(得分:13)
''
NULL
,因为Oracle不像其他高级语言或DBMS一样支持空字符串。
您需要使用IS NULL
或IS NOT NULL
没有其他关系运算符可以对NULL
起作用,尽管它在语法上是有效的。 SQLFiddle Demo
必须是,
select * from example_so where mycol IS NULL
编辑:根据Docs
Oracle数据库当前使用长度处理字符值 零为零。但是,将来这可能不会继续存在 发布,Oracle建议您不要处理空字符串 和nulls一样。
答案 1 :(得分:7)
因为NULL = NULL
根本就不为人知。也许是第三个国家?它既不是TRUE
也不是FALSE
。
Oracle将EMPTY STRING视为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>
答案 2 :(得分:0)
从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'));