1

どのデータベースでも、coalesce()null許容フィールドが等しいかどうかを比較するために使用するのが一般的な方法のようです。たとえば、2つのnull許容文字列フィールドを比較する場合は、を使用しますwhere coalesce(tbl1.stringfield,'') = coalesce(tbl2.stringfield,'')。これが機能するのは、の空の文字列が''コンテキストに応じて非常にうまく変換されるためnullです。

ただし、「空の」同等物がない日付や数値などのデータ型を処理している場合はどうなりますか?Teradataで試行するとwhere coalesce(tbl1.numberfield,'') = coalesce(tbl2.numberfield,'')、フィールドの1つがnullでない場合、データ型の不一致エラーが発生します。これは、数値を空の文字列と比較しようとするためです。それを機能させるには、を使用する必要がありますwhere coalesce(tbl1.numberfield,0) = coalesce(tbl2.numberfield,0)。ただし、tbl1.numberfieldがnullで、tbl2.numberfieldに実際に値0が含まれている場合はどうなりますか?そのWHERE条件は、実際には1つの値がnullで、もう1つの値が0であるため、falseを返す必要がある場合に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

そして、2つのヌルを単純な等号と比較することが許可されていれば、これをすべて回避できると考えること。

4

1 に答える 1

2

なぜだけではないのですか

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

これは、私が精通しているnull可能フィールドの公平性をチェックするための標準であり、すべての場合に機能するはずです。読者にとってはより簡単で、より速く実行されるはずです。

于 2012-12-03T17:34:47.050 に答える