8

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

MYCOL
--------
NULL
example

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

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

3 回答 3

16

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

您需要使用IS NULL或查找 NULL/空字符串IS NOT NULL

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

它一定要是,

select * from example_so where mycol IS NULL

编辑:根据文档

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

于 2014-10-09T09:24:52.677 回答
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>
于 2014-10-09T09:25:13.627 回答
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'));
于 2014-10-09T10:22:43.310 回答