1

我在这个问题上看到了许多变体,但在询问比较空值时,它们似乎都在谈论性能和索引。

我的问题是我有一个嵌套的 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_ 为 date

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

因此,如果参数是今天,则选择返回“fval”,我们就可以正确地左连接。但是,当日期参数在 '2012-09-10' 之前,则嵌套选择正在比较 null 并且左连接不会正确发生。这是原始版本的简化版本。

谢谢

4

3 回答 3

6

use NVL(inDate, sysdate+1) to not match when null

于 2012-09-11T21:16:47.627 回答
0

No records您需要了解和Null值之间的区别。当你说 - “当日期参数在 '2012-09-10' 之前,那么嵌套选择正在比较一个空值并且左连接没有正确发生”,这意味着SELECT返回一行但行值是NULL(这是与无记录不同)。在这种情况下,NVLNULL列值执行操作并将其替换为假字符串(如您所说)将像 -

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

以上将返回dummyif CompareValueisNULL但如果查询根本没有返回 NO RECORDS 则不会。

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

于 2012-09-12T00:56:09.337 回答
0

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

因此,我认为您不希望总是有结果。相反,我建议您在代码中处理空结果。

恐怕我无法给出更准确的答案,因为您还没有分享有关您案件的更多信息。

于 2012-09-11T21:42:06.503 回答