Concaténer une colonne sélectionnée dans une requête unique?
-
03-07-2019 - |
Question
Je sais que vous pouvez le faire, car je l’ai déjà vu faire une fois, mais j’oublie où et jusqu’à présent, je n’ai pas besoin de le faire.
J'ai une table appelée Employees, qui contient diverses données sur les employés (duh). J'ai besoin d'une requête qui sélectionne le nom et le prénom de toutes les lignes de la table, puis les contienne dans une chaîne délimitée par des virgules.
Par exemple, j'ai quelques lignes (beaucoup plus que cela en fait, mais dans l'intérêt de cette question, supposons simplement deux) de données qui ressemblent à:
FName LName ------- ----- Richard Prescott Jill Sentieri Carol Winger
Je dois sélectionner un élément capable de renvoyer les données susmentionnées sous la forme suivante:
Richard Prescott, Jill Sentieri, Carol Winger
Merci d’avance pour votre aide!
La solution
Utilisez coalesce. Quelque chose comme ça:
DECLARE @Names varchar(1000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM Employees
Autres conseils
C'est la méthode la plus efficace que j'ai trouvée. Cela nécessite SQL Server, mais cela ressemble à ce que vous utilisez.
select stuff((
select ', ' + fName + ' ' + lName
from Employees
order by lName, fName /* Optional */
for xml path('')
), 1, 2, '');
L'idée est que vous pouvez tirer parti de la possibilité d'utiliser un nom de balise vide avec for for chemin xml ('') pour obtenir la concaténation de chaînes sur plusieurs lignes. Le contenu (..., 1,2, '') supprime simplement la virgule.
C’est VRAIMENT rapide.
vous pouvez écrire un fichier UDF pour le faire
CREATE FUNCTION [dbo].[fnc_GetEmpList](
@CompId numeric
) RETURNS nvarchar(1000)
BEGIN
declare @str nvarchar(1000)
set @str =''
select @str = @str + ',' + FirstName + ' ' + LastName from Employees
--remove the last comma
if(@str<>'')
set @str = right(@str,len(@str)-1)
return @str
END
Peut-être que cela peut aider. Cette question a déjà été posée. Comment créer une fonction SQL Server pour " rejoindre " Plusieurs lignes d'une sous-requête dans un seul champ délimité?
Si vous utilisez MySQL, ils ont une excellente fonction appelée GROUP_CONCAT qui fait justement cela. http: //dev.mysql. com / doc / refman / 5.0 / fr / group-by-functions.html # function_group-concat
ce n'est pas parfait, mais cela vous mènera la plupart du chemin
declare @count int
declare @i int
declare @string nvarchar(max)
declare @name nvarchar(100)
declare @Employees (EmpName nvarchar(100), ID int identity(1,1)
insert into @Employees (EmpName)
select FirstName + ' ' + LastName
from Employees
select @count=count(*) from @Employees
set @i=1
set @string=''
while (@i<=@count)
begin
select @name = EmpName from @Employees where ID=@i
set @string = @string + ',' + @name
set @i=@i+1
end