複数のパラメータを に渡すことができることは知っていますがCOALESCE
、1 つの式だけをチェックして存在しないかどうかを確認したい場合、デフォルトを使用しますか、それともISNULL
代わりに使用する方がよい方法ですか?
2つの間にパフォーマンスの向上はありますか?
そうではないと思いますが、COALESCEはSQL '92標準であり、より多くの異なるデータベースでサポートされています。移植性を重視する場合は、ISNULLを使用しないでください。
言及する価値があるのは、この 2 つのタイプの処理によっても違いが生じる可能性があることです (この関連する回答項目 (2)を参照)。
クエリが null 比較を書き込むためのショートカットを使用しようとしているとします。
select * from SomeTable
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1);
とは異なります
select * from SomeTable
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1);
最初のケースでは、IsNull() は型をビットに強制するため (したがって、-1 は true に変換されます)、2 番目のケースでは両方が int に昇格します。
with input as
(
select convert(bit, 1) as BitOn,
convert(bit, 0) as BitOff,
convert(bit, null) as BitNull
)
select BitOn,
BitOff,
BitNull,
IsNull(BitOn, -1) IsNullBitOn, -- true
IsNull(BitOff, -1) IsNullBitOff, -- false
IsNull(BitNull, -1) IsNullBitNull, -- true, converts the -1 to bit
coalesce(BitOn, -1) CoalesceBitOn, -- 1
coalesce(BitOff, -1) CoalesceBitOff, -- 0
coalesce(BitNull, -1) CoalesceBitNull -- -1
from input;
質問自体に同様のコメント/リンク (@Martin Smith) があります。
null 条件が 1 つしかない場合は、ISNULL
オーバーヘッドが少なくなります。ただし、その違いはおそらく無視できるほどのものです。
COALESCE では、複数の式を使用できます。null ではなく、最初に発生する値を返します...たとえば
DECLARE @Value1 INT, @Value2 INT, @Value3 INT, @Value4 INT
SELECT @Value2 = 2, @Value4 = 4
SELECT COALESCE(@Value1, @Value2, @Value3, @Value4)
SELECT COALESCE(@Value1, @Value4, @Value3, @Value2)
ISNULL では、式が null の場合、指定された 2 番目のパラメーターが返されます。もちろん、1 つの式のみを確認できます...
したがって、複数の式をチェックし、それらの中で最初に非 null を選択する場合は、coalesce を使用します。それ以外の場合は ISNULL を選択します。