SQL Serverでは、COALESCE()
式は最初のnull以外の引数を返します。
動作方法は、引数のリストを式に渡し、引数を順番に評価し、最初はNULL
に評価されなかった最初の式の現在の値を返します。 。
構文
構文は次のようになります:
COALESCE ( expression [ ,...n ] )
例
簡単な例を次に示します。
SELECT COALESCE(null, 'Cat', 'Dog');
結果:
Cat
この場合、Cat
は最初の非NULL引数であったため、COALESCE()
その値を返しました。
表現
前述のように、COALESCE()
現在の値を返します 最初はNULL
と評価されない最初の式の 。したがって、次のような式を渡すと、次のようになります。
SELECT COALESCE( null, 2 * 3 );
これを取得します:
6
この関数は、データ型の優先順位が最も高い式のデータ型を返します。すべての式がnull不可の場合、結果はnull不可として入力されます。
すべての引数がNULLの場合
すべての引数がNULL
の場合 、COALESCE()
NULL
を返します 。ただし、null値の少なくとも1つは型指定されたNULL
である必要があります 、それ以外の場合はエラーが発生します。
つまり、すべてをNULL
にすることはできません。 定数:
SELECT COALESCE( null, null );
これを取得します:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
この場合、すべての引数はNULL
でした 定数であるため、エラーが返されました。
以下は、COALESCE()
のシナリオを示すデータベースの例です。 NULL
を返します すべての引数がNULL
の場合 。
次のクエリを実行するとします。
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
結果:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
両方の列にNULL
が含まれています 値。
したがって、両方の列をCOALESCE()
に渡すと 、NULL
の結果が得られます :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
結果:
NULL
列の1つをNULL
に置き換える場合も、同じことが言えます。 定数:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
結果:
NULL
つまり、すべて 引数はNULL
です エラーが発生する定数。
NULL
を置き換えます 既知の値の結果
NULLの結果をその既知の値に置き換えるために、最後の引数として既知の値を含めることができます。
たとえば、次のクエリはNULL
を返します :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals;
結果:
NULL
この場合、UnitPrice
列のすべての行にNULL値が含まれているため、結果はNULL
になりました。 。
COALESCE()
を使用できます このように:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals;
結果:
0.00
これで、NULLの結果が既知の値(ゼロ)に置き換えられます。
COALESCE()
vs CASE
COALESCE()
式は、実際にはCASE
の構文上のショートカットです。 表現。 COALESCE()
を使用する場合 式の場合、クエリオプティマイザはそれをCASE
として書き換えます。 表現。
次のステートメントを実行すると:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1;
クエリオプティマイザはそれを次のように書き換えます:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END
COALESCE()
vs ISNULL()
ある意味で、COALESCE()
式はISNULL()
に似ています 働き。しかし、違いがあります。特に:
-
ISNULL()
は関数であり、一度だけ評価されます。COALESCE()
一方、は式であり、複数回評価される可能性があります。 - 結果の式のデータ型の決定は異なります。
ISNULL
最初のパラメータのデータ型であるCOALESCE
を使用しますCASE
に従います 式は、優先順位が最も高い値のデータ型をルール化して返します。 - 結果式のNULL可能性は、
ISNULL
では異なります およびCOALESCE
。ISNULL
戻り値は常にNULL不可と見なされます(戻り値がNULL不可であると想定)。対照的に、COALESCE
null以外のパラメータを使用すると、NULL
と見なされます 。 -
ISNULL
の検証 およびCOALESCE
も違います。たとえば、NULL
ISNULL
の値int
に変換されます ただし、COALESCE
の場合 、データ型を指定する必要があります。 -
ISNULL
2つのパラメータのみを取ります。対照的に、COALESCE
可変数のパラメーターを取ります。
詳細情報
詳細およびより複雑な例については、Microsoftのドキュメントを参照してください。