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
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:
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/
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.
ISNULL
renvoie une valeur avec le même type de données que le premier paramètre, cependant
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.
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
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/
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
par exemple
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
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 leCOALESCE
fait.