77

複数のパラメータを に渡すことができることは知っていますがCOALESCE、1 つの式だけをチェックして存在しないかどうかを確認したい場合、デフォルトを使用しますか、それともISNULL代わりに使用する方がよい方法ですか?

2つの間にパフォーマンスの向上はありますか?

4

9 に答える 9

27

そうではないと思いますが、COALESCEはSQL '92標準であり、より多くの異なるデータベースでサポートされています。移植性を重視する場合は、ISNULLを使用しないでください。

于 2011-09-13T21:42:41.660 に答える
9

言及する価値があるのは、この 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) があります。

于 2014-10-06T20:45:18.073 に答える
2

null 条件が 1 つしかない場合は、ISNULLオーバーヘッドが少なくなります。ただし、その違いはおそらく無視できるほどのものです。

于 2011-09-13T21:53:51.130 に答える
-2

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 を選択します。

于 2014-04-16T12:05:45.817 に答える