COALESCE (Transact-SQL)

引数の中から、NULL でない最初の式を返します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

COALESCE ( expression [ ,...n ] ) 

引数

  • expression
    任意のデータ型のを指定します。

戻り値の型

expression のデータ型のうち、最も優先順位が高いものを返します。

解説

すべての引数が NULL の場合、COALESCE では NULL が返されます。

ms190349.note(ja-jp,SQL.90).gifメモ :
NULL 値の少なくとも 1 つは、型指定された NULL であることが必要です。

COALESCE(expression1**,**...n) は、次の CASE 関数と同じです。

CASE
   WHEN (expression1 IS NOT NULL) THEN expression1
   ...
   WHEN (expressionN IS NOT NULL) THEN expressionN
   ELSE NULL
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
)

次の例では、wages テーブルに、従業員の年俸に関する情報を表す 3 つの列 (時給、給与、歩合) が含まれています。ただし、1 人の従業員が受け取る給与の種類は 1 つだけです。すべての従業員に支払われている給料の総額を算出するには、COALESCE 関数を使って hourly_wagesalary、および commission から NULL でない値だけを取り出します。

SET NOCOUNT ON;
GO
USE master;
IF EXISTS (SELECT name FROM sys.tables
      WHERE name = 'wages')
   DROP TABLE wages;
GO
CREATE TABLE wages
(
   emp_id      tinyint    identity,
   hourly_wage   decimal   NULL,
   salary      decimal    NULL,
   commission   decimal   NULL,
   num_sales   tinyint   NULL
);
GO
INSERT wages VALUES(10.00, NULL, NULL, NULL);
INSERT wages VALUES(20.00, NULL, NULL, NULL);
INSERT wages VALUES(30.00, NULL, NULL, NULL);
INSERT wages VALUES(40.00, NULL, NULL, NULL);
INSERT wages VALUES(NULL, 10000.00, NULL, NULL);
INSERT wages VALUES(NULL, 20000.00, NULL, NULL);
INSERT wages VALUES(NULL, 30000.00, NULL, NULL);
INSERT wages VALUES(NULL, 40000.00, NULL, NULL);
INSERT wages VALUES(NULL, NULL, 15000, 3);
INSERT wages VALUES(NULL, NULL, 25000, 2);
INSERT wages VALUES(NULL, NULL, 20000, 6);
INSERT wages VALUES(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 wages;
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)

参照

関連項目

CASE (Transact-SQL)
ISNULL (Transact-SQL)
システム関数 (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手