How do I create a comma-separated list using a SQL query? How do I create a comma-separated list using a SQL query? sql-server sql-server

How do I create a comma-separated list using a SQL query?


MySQL

  SELECT r.name,         GROUP_CONCAT(a.name SEPARATOR ',')    FROM RESOURCES r    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id    JOIN APPLICATIONS a ON a.id = ar.app_idGROUP BY r.name

SQL Server (2005+)

SELECT r.name,       STUFF((SELECT ',' + a.name               FROM APPLICATIONS a               JOIN APPLICATIONRESOURCES ar ON ar.app_id = a.id              WHERE ar.resource_id = r.id           GROUP BY a.name            FOR XML PATH(''), TYPE).value('text()[1]','NVARCHAR(max)'), 1, LEN(','), '') FROM RESOURCES r

SQL Server (2017+)

  SELECT r.name,         STRING_AGG(a.name, ',')    FROM RESOURCES r    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id    JOIN APPLICATIONS a ON a.id = ar.app_idGROUP BY r.name

Oracle

I recommend reading about string aggregation/concatentation in Oracle.


NOTE:

This method is not recommended as it can give incorrect or non-deterministic results.
This has been documented on StackOverflow and DBA

Using COALESCE to Build Comma-Delimited String in SQL Server
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

Example:

DECLARE @EmployeeList varchar(100)SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') +    CAST(Emp_UniqueID AS varchar(5))FROM SalesCallsEmployeesWHERE SalCal_UniqueID = 1SELECT @EmployeeList


I don't know if there's any solution to do this in a database-agnostic way, since you most likely will need some form of string manipulation, and those are typically different between vendors.

For SQL Server 2005 and up, you could use:

SELECT     r.ID, r.Name,     Resources = STUFF(       (SELECT ','+a.Name        FROM dbo.Applications a        INNER JOIN dbo.ApplicationsResources ar ON ar.app_id = a.id        WHERE ar.resource_id = r.id        FOR XML PATH('')), 1, 1, '')FROM     dbo.Resources r

It uses the SQL Server 2005 FOR XML PATH construct to list the subitems (the applications for a given resource) as a comma-separated list.

Marc