COALESCE (Transact-SQL)
引数の中から、NULL でない最初の式を返します。
構文
COALESCE (expression [ ,...n ] )
戻り値の型
expression のデータ型のうち、最も優先順位が高いものを返します。すべての式で NULL 値が許可されない場合、結果は NULL 値が許可されない型になります。
説明
すべての引数が NULL の場合、COALESCE では NULL が返されます。
注 |
---|
NULL 値の少なくとも 1 つは、型指定された NULL であることが必要です。 |
COALESCE(expression1,...n) は、以下の CASE 式と機能的に等価です。
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
ISNULL と COALESCE は同じですが、動作は異なる場合があります。NULL 以外のパラメーターを使用して ISNULL を呼び出す式は NOT NULL であると見なされ、NULL 以外のパラメーターを使用して COALESCE を呼び出す式は NULL と見なされます。SQL Server では、NULL 以外のパラメーターを使用して COALESCE を呼び出す式にインデックスを設定するには、次のステートメントのように、PERSISTED 列属性を使用して計算列を保存できます。
CREATE TABLE #CheckSumTest
(
ID int identity ,
Num int DEFAULT ( RAND() * 100 ) ,
RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
);
例
A. 簡単な例を実行する
次の例では、COALESCE を使用して、NULL 以外の値を持つ最初の列からデータを選択する方法を示します。
USE AdventureWorks2008R2;
GO
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product ;
GO
B. 複雑な例を実行する
次の例では、wages テーブルに、従業員の年俸に関する情報 (時給、給与、歩合) が含まれている 3 つの列を含めています。ただし、1 人の従業員が受け取る給与の種類は 1 つだけです。すべての従業員に支払われている給料の総額を算出するには、COALESCE を使って hourly_wage、salary、および commission から NULL でない値だけを取り出します。
SET NOCOUNT ON;
GO
USE tempdb;
IF OBJECT_ID('dbo.wages') IS NOT NULL
DROP TABLE wages;
GO
CREATE TABLE dbo.wages
(
emp_id tinyint identity,
hourly_wage decimal NULL,
salary decimal NULL,
commission decimal NULL,
num_sales tinyint NULL
);
GO
INSERT dbo.wages (hourly_wage, salary, commission, num_sales)
VALUES
(10.00, NULL, NULL, NULL),
(20.00, NULL, NULL, NULL),
(30.00, NULL, NULL, NULL),
(40.00, NULL, NULL, NULL),
(NULL, 10000.00, NULL, NULL),
(NULL, 20000.00, NULL, NULL),
(NULL, 30000.00, NULL, NULL),
(NULL, 40000.00, NULL, NULL),
(NULL, NULL, 15000, 3),
(NULL, NULL, 25000, 2),
(NULL, NULL, 20000, 6),
(NULL, NULL, 14000, 4);
GO
SET NOCOUNT OFF;
GO
SELECT CAST(COALESCE(hourly_wage * 40 * 52,
salary,
commission * num_sales) AS money) AS 'Total Salary'
FROM dbo.wages
ORDER BY 'Total Salary';
GO
以下に結果セットを示します。
Total Salary
------------
20800.0000
41600.0000
62400.0000
83200.0000
10000.0000
20000.0000
30000.0000
40000.0000
45000.0000
50000.0000
120000.0000
56000.0000
(12 row(s) affected)