2014-10-09 90 views
5

我有这样的表,其中NULL是NULL值,而不是字符串NULL:甲骨文NVL与空字符串

MYCOL 
-------- 
NULL 
example 

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

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

回答

10

''又是Oracle NULL,因为Oracle不支持空字符串就像其他高级语言或数据库管理系统..

你需要使用IS NULLIS NOT NULL

寻找空/空字符串

没有其他关系运算符针对NULL工作,尽管它在语法上有效。 SQLFiddle Demo

它必须是,

select * from example_so where mycol IS NULL 

编辑:作为每Docs

Oracle数据库目前治疗字符值与为空的长度为零 。但是,这在未来的 版本中可能不会继续存在,并且Oracle建议您不要将空字符串 与空值相同。

+0

为什么' '''是'NULL'?是不是空串? – kmkaplan 2014-10-09 09:26:19

+0

由于Oracle中的空字符串为NULL。在答案中看到我的演示。 – 2014-10-09 09:28:20

+0

@kmkaplan更新回答与解释 – 2014-10-09 09:28:26

6

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

select * from example_so where 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'));