如何正确比较可空字段的相等性?

时间:2012-12-03 17:31:07

标签: null nullable teradata coalesce

在任何数据库中,使用coalesce()比较可空字段是否相等似乎是一种常见做法。例如,如果您要比较两个可以为空的字符串字段,则可以使用where coalesce(tbl1.stringfield,'') = coalesce(tbl2.stringfield,'')。这是有效的,因为''的空字符串在上下文中非常好地转换为null

但是,如果您正在处理日期或数字之类的数据类型,并且没有"空的"当量?在Teradata中,如果尝试where coalesce(tbl1.numberfield,'') = coalesce(tbl2.numberfield,''),如果其中一个字段不为空,则会出现数据类型不匹配错误。这是因为它试图将数字与空字符串进行比较。要使其发挥作用,您必须使用where coalesce(tbl1.numberfield,0) = coalesce(tbl2.numberfield,0)。但是,如果tbl1.numberfield为null并且tbl2.numberfield实际包含值0,该怎么办?实际上,当一个值为null而另一个为0时,WHERE条件将返回true。我能看到的唯一方法就是这个非常笨重的案例逻辑:

where case
    when 
        (tbl1.numberfield is null and tbl2.numberfield is null) or
        (tbl1.numberfield is not null and tbl2.numberfield is not null) or
        tbl1.numberfield <> tbl2.numberfield
    then 1
    else 0
end = 1

并且如果允许将两个空值与简单的等号进行比较,则可以避免所有这些。

1 个答案:

答案 0 :(得分:2)

为什么不

SELECT * FROM TABLE A, TABLE2 B WHERE A.a = B.a or ( A.a is NULL and b.A is NULL)

这是检查我熟悉的无效字段的权益的标准,它应该适用于所有情况。它更直接的读者,应该运行得更快。