web-dev-qa-db-fra.com

COALESCE Fonction en SQL

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

104
Lloyd Banks

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/

73
Bill Melius

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.

206
MatBailie

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
17
John Waclawski

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/

3
CindyPsych

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

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

par exemple. 

  • coalesce (null, 1, 2, 3) retournera 1.
  • coalesce (null, null) sera retournera null.
2
S'chn T'gai Spock
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
0
Xiao

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

0
Eddie Kumar