如何与oracle中可能为null的值进行比较?

时间:2012-09-11 21:13:40

标签: sql oracle null where-clause

我在这个问题上看到了很多变化,但在询问比较空值时,他们似乎都在讨论性能和索引。

我的问题是我有一个嵌套的SELECT,它可以返回null,我根据日期参数进行比较。

SELECT a.* 
FROM Table_One a,
     Table_Two b
WHERE a.Fieldc IN (SELECT CompareValue from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE)
AND a.Fielda = b.Fieldb(+)

似乎当嵌套选择返回null时,左连接会混乱。

如果需要,我会很乐意加入一些假数据,但也许我只是遗漏了一些东西。  我需要发生的是Fieldc比较只发生在该日期规范中。

感谢您的任何见解。 感谢。

更多信息:

Table_One数据:所有字段都是varchar2

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'eVal  | 'fVal'|
'dVal' | 'fVal  | 'eVal'|

Table_Two数据:所有字段都是varchar2

Fielda | Fieldb | Fieldc|
'aVal' | 'bVal' | 'cVal'|
'dVal' | 'fVal  | 'gVal'|
'dVal' | 'fVal  | 'cVal'|

Table_Three数据:CompareValue是varchar2,date_是日期

CompareValue | date_      |
'fval'       | 2012-09-10 |

因此,如果参数今天是select,则返回'fval',我们得到正确的左连接。但是,当date参数在'2012-09-10'之前时,嵌套的select正在比较null,而左连接没有正确发生。这是原版的简化版本。

由于

3 个答案:

答案 0 :(得分:6)

使用NVL(inDate, sysdate+1)时无效

答案 1 :(得分:0)

我假设您在表a中选择a.Fieldc被认为是“活动”,因为在table_three中它的inDate位于某个开始日期和sysdate之间。

因此我认为你不想总是有结果。相反,我建议你在代码中处理一个空的结果。

我担心我无法提供更准确的答案,因为您尚未分享有关您案件的更多信息。

答案 2 :(得分:0)

您需要了解No recordsNull值之间的区别。当你说 - “当date参数在'2012-09-10之前'时,嵌套的select正在比较null并且左连接没有正确发生”,这意味着SELECT返回一行但是行值为NULL(这与无记录不同)。在这种情况下,对NVL列值执行NULL并将其替换为假字符串(如您所说)将起作用 -

SELECT NVL(CompareValue,'dummy') 
  from Table_Three cv WHERE inDate between cv.Date_ and SYSDATE

如果dummyCompareValue,上述内容将返回NULL,但如果查询根本未返回NO RECORDS,则会返回

然而,查看您的数据,我没有看到NULL值的可能性,这使我相信子查询实际上将返回NO RECORDS(与NULL不同),如果inDate是在2012-09-10之前。在这种情况下,您的查询应该完全正常(除非在其他地方出现其他问题)。