COALESCE (Transact-SQL)

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

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

構文

COALESCE ( expression [ ,...n ] ) 

引数

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

戻り値の型

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
    );

簡単な例

次の例では、COALESCE が NULL 以外の値を含む最初の列からデータを選択する方法を示します。

USE AdventureWorks ;

GO

SELECT Name, Class, Color, ProductNumber,

COALESCE(Class, Color, ProductNumber) AS FirstNotNull

FROM Production.Product ;

GO

複雑な例

次の例では、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)