Fonction COALESCE dans TSQL


109

Quelqu'un peut-il expliquer comment fonctionne la fonction COALESCE dans TSQL? La syntaxe est la suivante

COALESCE (x, y)

Le document MSDN sur cette fonction est assez vague

Réponses:


74

On m'a dit que COALESCE est moins coûteux que ISNULL, mais la recherche ne l'indique pas. ISNULL prend uniquement deux paramètres, le champ évalué pour NULL et le résultat souhaité s'il est évalué comme NULL. COALESCE prendra n'importe quel nombre de paramètres et retournera la première valeur rencontrée qui n'est pas NULL.

Il y a une description beaucoup plus complète des détails ici http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/


6
Attention à l'utilisation ISNULL, ce n'est pas standard, moins flexible, j'ai lu qu'il renverra toujours le type de données du premier argument et non le type de données de la valeur retournée comme le COALESCEfait.
sprocket12

215

Je ne sais pas pourquoi vous pensez que la documentation est vague.

Il parcourt simplement tous les paramètres un par un et renvoie le premier qui est NOT NULL.

COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1


COALESCE(1, 2, 3, 4, 5, NULL)
=> 1


COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3


COALESCE(6, 5, 4, 3, 2, NULL)
=> 6


COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL

Il accepte à peu près n'importe quel nombre de paramètres, mais ils devraient être du même type de données. (S'ils ne sont pas du même type de données, ils sont implicitement convertis en un type de données approprié en utilisant l'ordre de priorité des types de données .)

C'est comme ISNULL()mais pour plusieurs paramètres, plutôt que deux.

C'est aussi ANSI-SQL, où-comme ISNULL()pas.


4
+1 Pour votre explication sur la priorité des types de données. Je crois que cela ISNULLrenvoie une valeur avec le même type de données que le premier paramètre, cependant
Lamak

5
Votre dernier exemple de code devrait donner l'erreur «Au moins un des arguments de COALESCE doit être un NULL typé» Source: sql-server-performance.com/2007/…
maqk

2
La documentation en dit long tout en réussissant à fournir une valeur presque nulle. Les bons documents fournissent un exemple simple avec un résultat simple. Coalesce se déplace immédiatement vers expressions, des comparaisons avec CASE, des comparaisons avec ISNULL, et enfin un exemple sans résultat. Puis un exemple trop complexe avec trop de détails. Lorsque tout ce dont nous avons besoin est cette réponse avec 5 à 6 lignes de WTF, cette chose est et fait.
P.Brian.Mackey


18

Voici ma vision de COALESCE ... et j'espère que cela a du sens ...

Sous une forme simpliste….

Coalesce (FieldName, 'Vide')

Donc, cela se traduit par… Si "FieldName" est NULL, remplissez la valeur du champ avec le mot "EMPTY".

Maintenant pour plusieurs valeurs ...

Coalesce (FieldName1, FieldName2, Value2, Value3)

Si la valeur de Fieldname1 est nulle, remplissez-la avec la valeur de Fieldname2, si FieldName2 est NULL, remplissez-la avec Value2, etc.

Ce morceau de code de test pour l' exemple de base de données AdventureWorks2012 fonctionne parfaitement et donne une bonne explication visuelle du fonctionnement de COALESCE :

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product

4

Il y a beaucoup plus à fusionner qu'un simple remplacement pour ISNULL. Je suis tout à fait d'accord pour dire que la "documentation" officielle de coalesce est vague et inutile. Cet article aide beaucoup. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/


3
Cet article auquel vous avez lié est extrêmement trompeur (comme l'ont souligné plusieurs personnes, y compris l'auteur, dans la section commentaires). Toutes les astuces qu'il met en évidence peuvent toutes être réalisées en utilisant ISNULL au lieu de coalesce.
Hobo Spider

3

Voici une simple requête contenant coalesce -

select * from person where coalesce(addressId, ContactId) is null.

Il renverra les personnes pour lesquelles addressId et contactId sont nuls.

fonction de fusion

  • prend au moins deux arguments.
  • les arguments doivent être de type entier.
  • renvoie le premier argument non nul.

par exemple

  • coalesce (null, 1, 2, 3) renverra 1.
  • coalesce (null, null) renverra null.

1

La définition la plus simple de la fonction Coalesce () pourrait être:

La fonction Coalesce () évalue tous les arguments passés puis renvoie la valeur de la première instance de l'argument qui n'a pas évalué à NULL.

Remarque: il évalue TOUS les paramètres, c'est-à-dire ne saute pas l'évaluation du ou des arguments sur le côté droit du paramètre retourné / NOT NULL.

Syntaxe:

Coalesce(arg1, arg2, argN...)

Attention : à part les arguments évalués à NULL, tous les autres arguments (NOT-NULL) doivent être soit du même type de données, soit de types correspondants (qui peuvent être "implicitement auto-convertis" en un type de données compatible), voir les exemples au dessous de:

PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.

DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today's date, works fine as implicit conversion into DATE type occurs.

--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.

HTH


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

1
J'ai trouvé que celui-ci est beaucoup plus simple.
Xiao
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.