Oracle NVL与空字符串

12

我有一个表格,其中NULL是NULL值,而不是字符串NULL:

MYCOL
--------
NULL
example

为什么这个查询没有返回NULL行?

select * from example_so where nvl(mycol, '') = '';
3个回答

20

''在Oracle中仍然是NULL,这是因为Oracle不支持空字符串,就像其他高级语言或数据库管理系统一样。

您需要使用IS NULLIS NOT NULL来查找NULL/空字符串。

没有其他关系运算符可以用于NULL,尽管它在语法上是有效的。SQLFiddle演示

必须是:

select * from example_so where mycol IS NULL

编辑:根据文档

目前,Oracle数据库将长度为零的字符值视为空值。但是,这在将来的版本中可能不再成立,Oracle建议您不要将空字符串视为null。


奇怪,我似乎在文档中找不到这个。 - kmkaplan
我接受了你的答案,因为它回答了我的问题。但请注意,关系运算符确实可以与NULL一起使用。不过这需要非常小心谨慎。 - kmkaplan
@kmkaplan在fiddle链接中添加了一些SQL作为演示。SQL成功运行,但表达式的结果将是“UNKNOWN”..我参考的文档也是如此显示。 - Maheswaran Ravisankar
1
“AND”和“OR”可以与“NULL”一起使用,以提供有用的(即不是“NULL”)结果。 - kmkaplan
OR会抑制索引使用。 - Lalit Kumar B
显示剩余3条评论

8

因为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>

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'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接