Concatenare una colonna selezionata in una singola query?
-
03-07-2019 - |
Domanda
So che puoi farlo, perché l'ho già visto una volta, ma dimentico dove e fino ad ora non ho avuto bisogno di farlo.
Ho una tabella chiamata Employees, e contiene vari dati sui dipendenti (duh). Ho bisogno di una query che esegua una selezione sul nome e cognome di tutte le righe nella tabella, e quindi contenga tutte in una stringa delimitata da virgole.
Ad esempio, ho alcune righe (molto più di questo in realtà, ma per il bene di questa domanda ne presumo solo due) di dati che sembrano:
FName LName ------- ----- Richard Prescott Jill Sentieri Carol Winger
Ho bisogno di una selezione che può restituire i dati di cui sopra in questo modulo:
Richard Prescott, Jill Sentieri, Carol Winger
Grazie in anticipo per il tuo aiuto!
Soluzione
Usa la coalizione. Qualcosa del genere:
DECLARE @Names varchar(1000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM Employees
Altri suggerimenti
Questo è il metodo più efficiente che ho trovato. Richiede SQL Server, ma sembra che sia quello che stai usando.
select stuff((
select ', ' + fName + ' ' + lName
from Employees
order by lName, fName /* Optional */
for xml path('')
), 1, 2, '');
L'idea è che puoi sfruttare la possibilità di utilizzare un nome tag vuoto con per il percorso xml ('') per ottenere la concatenazione di stringhe tra le righe. Il materiale (..., 1,2, '') rimuove solo la virgola iniziale.
Questo è DAVVERO veloce.
puoi scrivere un UDF per farlo
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
Forse questo può aiutare. Questa domanda è stata posta prima. Come creare una funzione di SQL Server per " join " più righe da una sottoquery in un singolo campo delimitato?
Se stai usando MySQL, hanno una grande funzione chiamata GROUP_CONCAT che fa proprio questo. http: //dev.mysql. com / doc / refman / 5.0 / it / group-by-functions.html # function_group-concat
questo non è perfetto, ma ti porterà quasi ovunque
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