带有空字符串的Oracle NVL

时间:2014-10-09 09:20:38

标签: sql oracle null nvl

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

MYCOL
--------
NULL
example

为什么此查询会返回NULL行?

select * from example_so where nvl(mycol, '') = '';

3 个答案:

答案 0 :(得分:13)

Oracle中再次'' NULL,因为Oracle不像其他高级语言或DBMS一样支持空字符串。

您需要使用IS NULLIS NOT NULL

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