我有很多表混合了真实的表格。列中带空值的值。从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将排除那些。
答案 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;
答案 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');
;