比较Oracle SQL中的空值

比较Oracle SQL中的空值,sql,oracle,null,Sql,Oracle,Null,如果两个值可以是空值而不是以下值,那么有没有更好的方法来比较这两个值是否相等 a = b or (a is null and b is null) 您可以使用nvl将其包装,并将其设置为集合中不需要的值: NVL(a,0) = NVL(b,0) 你可以: a=b or coalesce(a,b) is null 您也可以使用nvl,但这是一个遗留函数,而且合并更快,因为它在第一个非空时停止您可以使用解码(a,B,1)=1 解码在处理空值时是不规则的 然而我认为意图不清楚,我更喜欢沃伦的答案

如果两个值可以是空值而不是以下值,那么有没有更好的方法来比较这两个值是否相等

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

您可以使用nvl将其包装,并将其设置为集合中不需要的值:

NVL(a,0) = NVL(b,0)
你可以:

a=b or coalesce(a,b) is null
您也可以使用
nvl
,但这是一个遗留函数,而且
合并
更快,因为它在第一个非空时停止

您可以使用
解码(a,B,1)=1

解码在处理空值时是不规则的


然而我认为意图不清楚,我更喜欢沃伦的答案。清晰而不是减少打字

如果A为0,B为null,则结果不同。我认为haitek暗示
0
是集合中不期望的值。我认为这是一个很好的例子,说明在代码中保留SQL注释很重要。这是有效的,但对于程序员/维护人员来说,了解字段的可能值很重要;这可能正是我回避它的原因。请注意,一般来说,虽然有更简单的编写方法,但这可能是最有效的方法,因为没有函数引用。我很好奇这是不是真的,仅仅因为
为null
没有括号,并不意味着不调用函数;毕竟,仍在进行比较。我敢打赌,db已经针对
coalesce
进行了优化,因为它经常被使用。我并不是说你们错了,只是说用更新的db引擎对它进行基准测试会很有趣。只是在一个11g实例上进行了测试。虽然没有那么引人注目,但coalesce使用了大约10%的CPU.ty,DCookie,这是很好的一般信息。如果有人能用以下数据做同样的分析:有多少元组-字段、记录、表?桌子的大小有什么不同?速度有什么不同?只是好奇。这个答案是误导性的:
nvl
coalesce
在大多数使用中表现相当(传递两列或一列和一个静态值)。只有当第二个参数是函数或复杂求值(第一个参数为null)时,
coalesce
的性能才更好。我认为
nvl
只接受两个参数,而
coalesce
将接受一个列表,因此是的,您是正确的。另一件需要注意的事情是,我认为
nvl
不需要严格的数据类型,而
coalesce
要求所有数据类型都相同,这可能会对性能产生一些影响。