SQL*_*L_M 5 sql t-sql sql-server json
我有一个包含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
Run Code Online (Sandbox Code Playgroud)
我的查询尝试:
SELECT ID, Keys, ValueV
FROM #Test
GROUP BY ID, keys, ValueV
FOR JSON AUTO
Run Code Online (Sandbox Code Playgroud)
但这会返回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|
Run Code Online (Sandbox Code Playgroud)
提前致谢!
这有效(在STRING_AGG可用的SQL Server 2017 中),但非常笨拙。我不确定没有更优雅的方式。
SELECT (
SELECT
ID,
ValueV,
Keys = JSON_QUERY('["' + STRING_AGG(STRING_ESCAPE(Keys, 'json'), '","') + '"]')
FOR JSON PATH
)
FROM #Test
GROUP BY ID, ValueV
Run Code Online (Sandbox Code Playgroud)
对于 SQL Server 2016(没有STRING_AGG,或者STRING_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
Run Code Online (Sandbox Code Playgroud)
甚至不那么优雅,但你可以得到你能得到的。至少我们没有连接FOR XML...
小智 7
如果有人有相同类型的用例,请发布此内容
SELECT [t].[ID],
(SELECT [t1].[KEYS], [t1].[ValueV] FROM @Test t1 WHERE t1.[ID] = [t].id FOR JSON PATH ) a
FROM @Test AS [t]
GROUP BY [t].[ID]
Run Code Online (Sandbox Code Playgroud)