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不可であると想定)。対照的に、COALESCEnull以外のパラメータを使用すると、NULLと見なされます 。 -
ISNULLの検証 およびCOALESCEも違います。たとえば、NULLISNULLの値intに変換されます ただし、COALESCEの場合 、データ型を指定する必要があります。 -
ISNULL2つのパラメータのみを取ります。対照的に、COALESCE可変数のパラメーターを取ります。
詳細情報
詳細およびより複雑な例については、Microsoftのドキュメントを参照してください。