【问题标题】:Comparing nulls in Oracle SQL比较 Oracle SQL 中的空值
【发布时间】:2011-06-27 03:09:51
【问题描述】:

如果两个值可以是以下以外的空值,是否有更好的方法来比较它们是否相等?

a = b or (a is null and b is null)

【问题讨论】:

  • Get null == null in SQL 的可能副本。请注意,一般来说,虽然有更简单的方法来编写它,但它可能是最有效的方法,因为没有函数引用。
  • 我很好奇这是不是真的,因为is null 没有括号,并不意味着不调用函数;毕竟,还是要进行比较。我敢打赌,数据库已经针对coalesce 进行了优化,因为它被频繁使用。我并不是说你错了,只是用较新的数据库引擎对其进行基准测试会很有趣。
  • 刚刚在一个11g的实例上测试过。虽然没有那么戏剧化,但合并使用了大约 10% 的 CPU。
  • ty,DCookie,这是很好的一般信息。如果有人可以做同样的分析:多少元组——字段、记录、表?桌子大小有什么区别?速度有什么不同?只是好奇。

标签: sql oracle null


【解决方案1】:

你可以:

a=b or coalesce(a,b) is null

您也可以使用nvl,但这是一个遗留函数,coalesce 更快,因为它会在第一个非 null 处停止

【讨论】:

  • 这个答案具有误导性:nvlcoalesce 在大多数用途中表现相同(传递两列或一列和一个静态值)。只有当第二个参数是函数或复杂求值(且第一个参数为空)时,coalesce 才能表现得更好。
  • 好吧,我认为nvl 只接受两个参数,而coalesce 将接受一个列表,所以是的,你是对的。另一件需要注意的事情是,我相信nvl 不需要严格的数据类型,而coalesce 要求所有数据类型都相同——这可能会影响性能。
【解决方案2】:

您可以使用DECODE(A,B,1) = 1

DECODE 在处理 NULL 时是不规则的。

但我认为意图尚不清楚,更喜欢 vol7ron 的答案。明确减少打字!

【讨论】:

    【解决方案3】:

    您可以用 nvl 包装它并将其设置为您的集合中不期望的某个值:

    NVL(a,0) = NVL(b,0)
    

    【讨论】:

    • A 为 0 且 B 为 null 的结果不同。
    • 我认为 haitek 暗示 0 是集合中未预期的值。我认为这是一个很好的例子,说明使用代码保留 SQL cmets 很重要。了解该字段的可能值是有效的,但对于程序员/维护人员来说很重要;这可能是我回避它的原因
    猜你喜欢
    • 2012-05-14
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多