I have a table with 3 columns, I want to query that table such that the result will be a JSON object.
Sample data looks like this:
CREATE TABLE #Test (
My two cents:
Interesting that you want valid individual JSON rows and not one single JSON string. Anyhow, here are some alternate answers, although the accepted answer is the best one.
-- 100% hardcoded yourself. Pre SQL Server 2016
SELECT '[{"ID":' + convert(nvarchar(4),T1.[ID]) + ',"ValueV":' + convert(nvarchar(4),T1.[ValueV]) + ',"Keys":["' + T1.[Keys] + '","' + T2.[Keys] + '"]}]' AS [keys]
FROM #Test AS T1 INNER JOIN #Test T2 ON t2.ID = t1.ID AND t2.ValueV = t1.ValueV AND t2.keys > t1.keys
Or:
-- Use the OPENJSON to output your results as a dataset and not just a single row. I've removed the escape character back slashes to match the accepted answers output
SELECT
'[' + REPLACE((REPLACE((REPLACE([value], '\','')),':"[',':[')),']"}',']}') + ']'
FROM OPENJSON(
(SELECT T1.[ID],T1.[ValueV], '["' + T1.[Keys] + '","' + T2.[Keys] + '"]' AS [keys]
FROM #Test AS T1 INNER JOIN #Test T2 ON t2.ID = t1.ID AND t2.ValueV = t1.ValueV AND t2.keys > t1.keys
FOR JSON PATH))
Or:
-- This is a lot cleaner for an array of values in pairs. Again using OPENJSON to output your desired result.
select
'[' + [Value] + ']' FROM OPENJSON(
(select T1.[ID], T1.[ValueV], JSON_MODIFY(JSON_MODIFY('[]','append lax $',t0.keys),'append lax $',t1.keys) as keys
FROM #Test AS T0 inner join #Test as t1
on t0.ID = t1.ID AND t0.ValueV = t1.ValueV AND t0.keys < t1.keys
FOR JSON path))
Just quick a note that JSON itself is not an object, but just a string of named value pairs, valid JavaScript but a subset nonetheless, it looks completely different when for instance you want a nested Javascript object (If JS is your intended data destination, I'm assuming here). The JSON function's great for quickly pulling off data for transfer, but when you want a nested output or grouping the dataset for an array of values not objects, it can become quite tricky. Personally, since it's a string, for more complicated stuff I just build it myself. Hope that's a different take.