当列包含具有NULL的记录时,检查!=值

时间:2017-07-26 03:27:11

标签: oracle oracle11g null

我有很多表混合了真实的表格。列中带空值的值。从exerience,发出一个SELECT看起来像:

SELECT column1, column2, column3 FROM mytable WHERE column1 != 'a value';

...不会返回我期望的记录。在我正在处理的当前表中,这会返回一个空记录集,即使我知道我在表中有记录,其中列中的NULL为NULL,而表中的其他记录的值为#34;!=&# 34;在第1栏。在这种情况下,我希望在column1中看到包含NULL的记录(当然,如果在column1中还有其他值没有'值,那么其他任何内容。

在WHERE子句中尝试NVL并不能给我任何不同的东西:

SELECT column1, column2, column3 FROM mytable WHERE NVL(column1, '') != 'a value';

...也返回一个空的记录集。

使用' IS NULL'在技​​术上会在我当前的例子中给我正确的记录集,但当然,如果任何记录改变为类似于'另一个值'在column1中,那么IS NULL将排除那些。

5 个答案:

答案 0 :(得分:3)

无法以与其他值相同的方式比较NULL。您必须使用IS NULL。如果要包含NULL值,请在WHERE子句中添加OR:

SELECT column1, column2, column3 FROM mytable WHERE column1 != 'a value' OR column1 IS NULL

答案 1 :(得分:2)

查询不起作用,因为SQL处理的等式检查(!=)与检查是否为null(IS NULL)不同。

你在这里可以做的是:

SELECT column1, column2, column3 
FROM mytable 
WHERE column1 != 'a value' OR column1 is null;

请参阅Not equal <> != operator on NULL

答案 2 :(得分:1)

你所尝试的是正确的。你只需要稍微改变一下。见下文 -

SELECT column1, column2, column3 FROM mytable WHERE NVL(column1, '0') != 'a value';

而不是空字符串,传递NVL的第二个参数中的任何字符。

答案 3 :(得分:0)

  

“在WHERE子句中尝试使用NVL似乎没有给我任何不同的东西”

这是真的:

SQL> select * from mytable;

COLUMN1                 COLUMN2 COLUMN3
-------------------- ---------- ---------
a value                       1 25-JUL-17
not a value                   2 25-JUL-17
whatever                      3 25-JUL-17
                              4 26-JUL-17

SQL> SELECT column1, column2, column3 FROM mytable WHERE NVL(column1, '') != 'a value';

COLUMN1                 COLUMN2 COLUMN3
-------------------- ---------- ---------
not a value                   2 25-JUL-17
whatever                      3 25-JUL-17

SQL> 

这是因为你的实验还不够。由于历史原因,Oracle将空字符串视为null,因此您的nvl()语句实际上只将一个空值替换为另一个。但如果您在通话中使用了适当的值,您将得到您想要的结果:

SQL> SELECT column1, column2, column3 FROM mytable WHERE NVL(column1, 'meh') != 'a value';

COLUMN1                 COLUMN2 COLUMN3
-------------------- ---------- ---------
not a value                   2 25-JUL-17
whatever                      3 25-JUL-17
                              4 26-JUL-17

SQL> 

另一种方法是显式测试NULL并测试排除值...

SQL>  SELECT column1, column2, column3 FROM mytable
  2  where column1 is null or column1 != 'a value';

COLUMN1                 COLUMN2 COLUMN3
-------------------- ---------- ---------
not a value                   2 25-JUL-17
whatever                      3 25-JUL-17
                              4 26-JUL-17

SQL> 

第二种方法可能更正统。

答案 4 :(得分:0)

1)未记录的Oracle函数SYS_OP_MAP_NONNULL。 (它存在于oracle10)

with abc as ( select 'a value' as col1 from dual
                union all  
               select '' as col1 from dual)
      select * from abc
       where SYS_OP_MAP_NONNULL(col1) != SYS_OP_MAP_NONNULL('a value')      
      ; 

2)LNNVL - 检查文档中的表格以便澄清。

with abc as ( select 'a value' as col1 from dual
                union all  
               select '' as col1 from dual)
      select * from abc
       where lnnvl( col1 = 'a value');    
      ;