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!

È stato utile?

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

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top