我在这个问题上看到了很多变化,但在询问比较空值时,他们似乎都在讨论性能和索引。
我的问题是我有一个嵌套的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,而左连接没有正确发生。这是原版的简化版本。
由于
答案 0 :(得分:6)
使用NVL(inDate, sysdate+1)
时无效
答案 1 :(得分:0)
我假设您在表a中选择a.Fieldc被认为是“活动”,因为在table_three中它的inDate位于某个开始日期和sysdate之间。
因此我认为你不想总是有结果。相反,我建议你在代码中处理一个空的结果。
我担心我无法提供更准确的答案,因为您尚未分享有关您案件的更多信息。
答案 2 :(得分:0)
您需要了解No records
和Null
值之间的区别。当你说 - “当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
如果dummy
为CompareValue
,上述内容将返回NULL
,但如果查询根本未返回NO RECORDS,则会返回
然而,查看您的数据,我没有看到NULL值的可能性,这使我相信子查询实际上将返回NO RECORDS(与NULL
不同),如果inDate
是在2012-09-10之前。在这种情况下,您的查询应该完全正常(除非在其他地方出现其他问题)。