回答:
COALESCEはISNULLよりもコストが安いと言われていますが、調査ではそれが示されていません。ISNULLは2つのパラメーターのみを受け取ります。NULLとして評価されるフィールドと、NULLとして評価される場合に必要な結果です。COALESCEは任意の数のパラメーターを取り、NULLでない最初の値を返します。
詳細については、http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/を参照して ください。
ドキュメントが曖昧だと思う理由がわかりません。
すべてのパラメーターを1つずつ確認し、最初のを返しますNOT NULL
。
COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1
COALESCE(1, 2, 3, 4, 5, NULL)
=> 1
COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3
COALESCE(6, 5, 4, 3, 2, NULL)
=> 6
COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL
ほぼすべてのパラメーターを受け入れますが、それらは同じデータ型でなければなりません。 (それらが同じデータ型でない場合は、データ型の優先順位を使用して、適切なデータ型に暗黙的にキャストされます。)
ISNULL()
2つのパラメーターではなく、複数のパラメーターのようなものです。
またANSI-SQL
、そうでISNULL()
はありません。
ISNULL
ただし、最初のパラメーターと同じデータ型の値が返されると思います
expressions
、CASEとの比較、ISNULLとの比較、そして最後に結果のない例に移動します。次に、詳細が多すぎる過度に複雑な例を示します。5〜6行のWTFでこの答えが必要な場合、これは実際に行われます。
これがCOALESCEの見方です...そしてうまくいけばそれは理にかなっています...
単純化した形で…。
Coalesce(フィールド名、 '空')
したがって、これは次のように変換されます。「FieldName」がNULLの場合、フィールド値に「EMPTY」という単語を入力します。
次に、複数の値について...
Coalesce(フィールド名1、フィールド名2、値2、値3)
Fieldname1の値がnullの場合は、Fieldname2の値を入力します。FieldName2がNULLの場合は、Value2を入力します。
このAdventureWorks2012サンプルデータベースのテストコードは完全に機能し、COALESCEの機能を視覚的に詳しく説明しています。
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
単にISNULLを置き換えるだけでなく、結合する必要があることはたくさんあります。合体の公式の「文書化」が曖昧で役に立たないことに完全に同意します。この記事は大いに役立ちます。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Coalesce()関数の最も単純な定義は次のようになります。
Coalesce()関数は渡されたすべての引数を評価してから、NULLに評価されなかった引数の最初のインスタンスの値を返します。
注:すべてのパラメーターを評価します。つまり、返された/ NOT NULLパラメーターの右側の引数の評価をスキップしません。
構文:
Coalesce(arg1, arg2, argN...)
注意:NULLに評価される引数を除いて、他のすべての(NOT-NULL)引数は同じデータ型であるか、一致する型(互換性のあるデータ型に「暗黙的に自動変換」できる)でなければなりません。例を参照してください未満:
PRINT COALESCE(NULL, ('str-'+'1'), 'x') --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3) --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99) --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31') --returns today's date, works fine as implicit conversion into DATE type occurs.
--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str') --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
HTH
ISNULL
標準ではなく柔軟性が低いを使用することに注意してください。最初の引数のデータ型は常に返され、返される値のデータ型は返されCOALESCE
ません。