我有一个包含3列的表,我想查询该表,以便结果将是JSON对象。

样本数据如下所示:

 CREATE TABLE #Test (ValueV INT, KEYS NVARCHAR (100), ID INT)

 INSERT INTO #Test
 VALUES (1, N'ChangeAdress 19 - 21', 200),
        (1, N'ChangeAdress 20 - 22', 200),
        (1, N'ChangeAdress 22 - 24', 300),
        (1, N'ChangeAdress 23 - 25', 300),
        (2, N'ChangeAdress 24 - 26', 400),
        (2, N'ChangeAdress 25 - 27', 400),
        (3, N'ChangeAdress 26 - 28', 400),
        (3, N'ChangeAdress 27 - 29', 400)

 SELECT * FROM #Test

我的查询尝试:
 SELECT ID, Keys, ValueV
 FROM #Test
 GROUP BY ID, keys, ValueV
 FOR JSON AUTO

但这会返回1个JSON“行”。我想要的是每组一行。组是此处的ID,值组合。我对JSON对象的经验很少(可以从此查询中看到),因此将不胜感激。

所需的输出(但随后为每行JSON):
 --------------------------------------------------
|200, 1, ChangeAdress 19 - 21, ChangeAdress 20 - 22|
|300, 1, ChangeAdress 22 - 24, ChangeAdress 23 - 25|
|400, 2, ChangeAdress 24 - 26, ChangeAdress 25 - 27|
|400, 3, ChangeAdress 26 - 28, ChangeAdress 27 - 29|

提前致谢!

最佳答案

这是可行的(在SQL Server 2017中,可以使用STRING_AGG),但是非常笨拙。我不确定没有更优雅的方法。

SELECT (
    SELECT
       ID,
       ValueV,
       Keys = JSON_QUERY('["' + STRING_AGG(STRING_ESCAPE(Keys, 'json'), '","') + '"]')
    FOR JSON PATH
)
FROM #Test
GROUP BY ID, ValueV

对于SQL Server 2016(对此没有STRING_AGGSTRING_ESCAPE):
SELECT (
    SELECT ID, ValueV, Keys = JSON_QUERY(REPLACE(REPLACE(
        (
            SELECT Keys
            FROM #Test t2 WHERE t2.ID = t1.ID AND t2.ValueV = t1.ValueV
            FOR JSON PATH
        ),
        '{"Keys":', ''),
        '}', ''))
    FOR JSON PATH
)
FROM #Test t1
GROUP BY ID, ValueV

甚至不那么优雅,但您会尽力而为。至少我们没有与FOR XML串联...

关于SQL Server : query columns to JSON object with group by,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49574006/

10-11 08:51
查看更多