Quelqu'un peut-il expliquer le fonctionnement de la fonction COALESCE dans SQL? La syntaxe est la suivante
Le document MSDN sur cette fonction est assez vague
The MSDN document on this function is pretty vague
On m'a dit que COALESCE est moins coûteux que ISNULL, mais les recherches ne l'indiquent pas. ISNULL prend seulement deux paramètres, le champ en cours d'évaluation pour NULL et le résultat souhaité s'il est évalué en tant que NULL. COALESCE prendra n'importe quel nombre de paramètres et retournera la première valeur rencontrée qui n'est pas NULL.
Il existe une description beaucoup plus détaillée des détails ici http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
Je ne sais pas pourquoi vous pensez que la documentation est vague.
Il passe 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 doivent être du même type de données. (S'ils ne correspondent pas au même type de données, ils sont implicitement convertis en un type de données approprié à l'aide de ordre de priorité du type de données .)
C'est comme ISNULL()
mais pour plusieurs paramètres, plutôt que deux.
C'est aussi ANSI-SQL
, où-comme ISNULL()
ne l'est pas.
Voici comment je vois COALESCE ... et j'espère que cela a du sens ...
Dans une forme simpliste….
Coalesce (FieldName, 'Empty')
Donc, cela se traduit par ... Si "Nom du champ" est NULL, remplissez la valeur du champ avec le mot "EMPTY".
Passons maintenant aux valeurs multiples ...
Coalesce (FieldName1, FieldName2, Value2, Value3)
Si la valeur dans Fieldname1 est null, remplissez-la avec la valeur dans Fieldname2, si FieldName2 est NULL, remplissez-la avec Value2, etc.
Ce code de test pour la base de données exemple 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
Il y a beaucoup plus à concilier que le simple remplacement de ISNULL. Je suis tout à fait d’accord pour dire que la "documentation" officielle de la fusion est vague et inutile. Cet article aide beaucoup. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
Voici une requête simple contenant coalesce -
select * from person where coalesce(addressId, ContactId) is null.
Il renverra les personnes où addressId et contactId sont nuls.
fonction de fusion
par exemple.
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
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 été évaluée à NULL.
Remarque: il évalue TOUS les paramètres, c’est-à-dire qu’il ne saute pas l’évaluation des arguments situés à droite du paramètre renvoyé/NOT NULL.
Syntaxe:
Coalesce(arg1, arg2, argN...)
Beware: Si l'on exclut les arguments évalués à NULL, tous les autres arguments transmis (NOT-NULL) doivent appartenir au même type de données ou à matching-types (pouvant être "implicitement auto" -converted "dans un type de données compatible), voir les exemples ci-dessous:
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 into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type
HTH