どのデータベースでも、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つのヌルを単純な等号と比較することが許可されていれば、これをすべて回避できると考えること。