【问题标题】:How can I compare against a possibly null value in oracle?如何与 oracle 中可能的空值进行比较?
【发布时间】:2012-09-12 08:56:09
【问题描述】:

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

我的问题是我有一个嵌套的 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 并且左连接不会正确发生。这是原版的简化版。

谢谢

【问题讨论】:

  • 当值为空或不匹配时,你希望它匹配吗?
  • 从查询中我不清楚为什么需要左外连接。
  • 与您的问题无关,但尽管如此:不要将 (+) 运算符用于外部连接。使用正确的LEFT JOIN 语法。
  • 左连接“搞砸了”并不是非常有用。这到底是什么意思呢?错误代码?如果子查询返回null,你想发生什么?

标签: sql oracle null where-clause


【解决方案1】:

使用NVL(inDate, sysdate+1) 不匹配时为空

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • Bazz 你是对的,当按日期激活时,我正在匹配 table_three 中的值。我在我的问题中包含了额外的信息来反映这一点。
    【解决方案3】:

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

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

    如果CompareValueNULL,上述将返回dummy,但如果查询根本没有返回记录,则不会。

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

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多