MHi*_*ers 2 t-sql sql-server json
我开始研究如何在 MSSQL 2016+ 中处理 JSON
我只是创建了一个具有 ID (int) 和 JSON (nvarchar) 列的表。
以下是我的查询以显示该问题:
第一个查询仅返回关系表结果,很好并且符合预期。
SELECT * FROM WS_Test
-- Results:
1 { "name": "thomas" }
2 { "name": "peter" }
Run Code Online (Sandbox Code Playgroud)
第二个查询仅返回 json 列,因为“JSON”创建了我的 MSSQL。
不太好,因为它将 json 列内容输出为字符串,而不是解析后的 JSON。
SELECT json FROM WS_Test FOR JSON PATH
-- Results:
[{"json":"{ \"name\": \"thomas\" }"},{"json":"{ \"name\": \"peter\" }"}]
Run Code Online (Sandbox Code Playgroud)
第三个查询给了我两个结果行,其中 json 列内容为解析的 JSON,很好。
SELECT JSON_QUERY(json, '$') as json FROM WS_Test
-- Results:
{ "name": "thomas" }
{ "name": "peter" }
Run Code Online (Sandbox Code Playgroud)
第四个查询为我提供了 json 列内容作为一个(!)JSON 对象,完美解析。
SELECT JSON_QUERY(json, '$') as json FROM WS_Test FOR JSON PATH
-- Results:
[{"json":{ "name": "thomas" }},{"json":{ "name": "peter" }}]
Run Code Online (Sandbox Code Playgroud)
但是:我不想在示例四的每个数组对象中拥有包含 json 列内容的“json”属性。我只想要一个包含列内容的数组,不能少,不能多。像这样:
[
{
"name": "peter"
},
{
"name": "thomas"
}
]
Run Code Online (Sandbox Code Playgroud)
我怎样才能仅使用 T-SQL 来归档它?这可能吗?
该FOR JSON子句将始终包含列名称 - 但是,您可以简单地将列中的所有值连接json成一个结果,然后在其周围添加方括号。
首先,创建并填充示例表(请在您以后的问题中保存此步骤):
CREATE TABLE WS_Test
(
Id int,
Json nvarchar(1000)
);
INSERT INTO WS_Test(Id, Json) VALUES
(1, '{ "name": "thomas" }'),
(2, '{ "name": "peter" }');
Run Code Online (Sandbox Code Playgroud)
对于 SQL Server 2017 或更高版本,请使用内置string_agg函数:
SELECT '[' + STRING_AGG(Json, ',') + ']' As Result
FROM WS_Test
Run Code Online (Sandbox Code Playgroud)
对于较低版本,您可以使用for xml pathwithstuff来获得与 相同的结果string_agg:
SELECT STUFF(
(
SELECT ',' + Json
FROM WS_Test
FOR XML PATH('')
), 1, 1, '[')+ ']' As Result
Run Code Online (Sandbox Code Playgroud)
这两个查询的结果将是这样的:
Result
[{ "name": "thomas" },{ "name": "peter" }]
Run Code Online (Sandbox Code Playgroud)
您可以在以下位置观看现场演示DB<>Fiddle
| 归档时间: |
|
| 查看次数: |
6569 次 |
| 最近记录: |