COALESCE (Transact-SQL)

Retourne la première expression non NULL parmi ses arguments.

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

COALESCE ( expression [ ,...n ] ) 

Arguments

Notes

Si tous les arguments sont NULL, COALESCE retourne la valeur NULL.

ms190349.note(fr-fr,SQL.90).gifRemarque :
Au moins une des valeurs NULL doit être de type NULL.

La fonction COALESCE(expression1**,**...n) est équivalente à cette fonction CASE :

CASE
   WHEN (expression1 IS NOT NULL) THEN expression1
   ...
   WHEN (expressionN IS NOT NULL) THEN expressionN
   ELSE NULL
END

ISNULL et COALESCE, bien qu'ils soient équivalents, peuvent se comporter différemment. Une expression qui comprend ISNULL et des paramètres non NULL est considérée NOT NULL, tandis que les expressions comprenant COALESCE et des paramètres non NULL sont considérées NULL. Dans SQL Server, pour indexer des expressions comprenant COALESCE et des paramètres non NULL, la colonne calculée peut être conservée à l'aide de l'attribut de colonne PERSISTED comme dans l'instruction suivante :

CREATE TABLE #CheckSumTest 
(
        ID int identity ,
        Num int DEFAULT ( RAND() * 100 ) ,
        RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
)

Types de retour

Retourne le type de données de expression dont la priorité de type de données est la plus élevée.

Exemple

Dans l'exemple suivant, la table wages comporte trois colonnes d'informations sur les salaires annuels des employés : salaire horaire, salaire et commissions. Cependant, chaque employé ne perçoit qu'un seul type de salaire. Pour déterminer le montant total versé à tous les employés, la fonction COALESCE permet de retourner seulement les valeurs non NULL trouvées dans les colonnes hourly_wage, salary et commission.

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

Voici l'ensemble des résultats.

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)

Voir aussi

Référence

CASE (Transact-SQL)
ISNULL (Transact-SQL)
Fonctions système (Transact-SQL)

Aide et Informations

Assistance sur SQL Server 2005