Reputation: 164
I have a table in SQL Server that looks like this:
id: int
key: nvarchar(max)
value: nvarchar(max)
I want to select distinct keys as first column and all values with same key joined with '<br/>'
as my second column. The key values are dynamic and is not predefined - and the performance really matters - I don't want to use Linq or any UDF!
id key value
---------------------------------------
1 color red<br/>white<br/>black
4 size 15"
PS: I have searched a lot sorry if it's duplicated, currently running on SQL Server 2014 but I can move to 2019
Upvotes: 1
Views: 1068
Reputation: 22275
Please try the following solution. It will work starting from SQL Server 2008 onwards.
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [key] NVARCHAR(MAX), [value] NVARCHAR(MAX));
INSERT INTO @tbl ([key], [value]) VALUES
(N'color', N'red'),
(N'color', N'white'),
(N'color', N'black'),
(N'size', N'15"');
-- DDL and sample data population, end
DECLARE @separator CHAR(5) = '<br/>'
, @encoded VARCHAR(20) = '<br/>';
SELECT c.[key]
, STUFF(REPLACE(
(SELECT @separator + CAST([value] AS NVARCHAR(MAX)) AS [text()]
FROM @tbl AS O
WHERE O.[key] = C.[key]
FOR XML PATH('')
), @encoded, @separator)
, 1, LEN(@separator), NULL) AS valueList
FROM @tbl AS c
GROUP BY c.[key];
Output
+-------+-------------------------+
| key | valueList |
+-------+-------------------------+
| color | red<br/>white<br/>black |
| size | 15" |
+-------+-------------------------+
Upvotes: 1