如何在 json 根节点中添加键值对并使用 SQL Server 将其转换为表
Posted
技术标签:
【中文标题】如何在 json 根节点中添加键值对并使用 SQL Server 将其转换为表【英文标题】:how to add key-value pair in json root node and convert it into table using SQL server 【发布时间】:2020-10-14 09:52:11 【问题描述】:我有桌人,它维护四列,分别是 Name 、TagName 、Value 、 Location。 我想将 json 中的标记名和值转换为名称和位置列作为根节点(多个记录的名称和位置相同)
需要输出为:
""Name":"EMP1","Location":"mumbai"": [
"TagName": "1",
"Value": "844.17769999999996"
,
"TagName": "abc",
"Value": "837.43679999999995"
,
"TagName": "pqr",
"Value": "0"
,
"TagName": "XYZ",
"Value": "1049.2429999999999"
]
请检查以下查询,其中我尝试使用 json 路径创建 json 字符串,但卡在根节点中。
SELECT TagName
,Value
FROM dbo.people
FOR JSON PATH, ROOT('')---
当我将上面的 json 转换为表格格式时,需要输出为:
Name | Location |TagName| Value
EMP1 | Mumbai |1 | 844.17769999999996|
EMP1 | Mumbai |abc | 837.43679999999995|
.....
【问题讨论】:
你真的想要第一个大括号 (
) 用双引号 ("
) 括起来吗?这不是有效的 JSON。
样本数据和预期结果将帮助我们帮助您。你给出的 SQL 语句,和表没有相同的列。这些数据是来自 2 个表还是 1 个?你试过JSON AUTO
而不是JSON PATH
吗?
如果您认为这个或任何其他答案是您问题的最佳解决方案,您可以accept它。只能接受一个答案。
【参考方案1】:
您的预期输出不是有效的 JSON,但您可能正在寻找类似这样的内容:
表:
CREATE TABLE People (
[Name] varchar(10),
[Location] varchar(50),
[TagName] varchar(3),
[Value] numeric(20, 14)
)
INSERT INTO People ([Name], [Location], [TagName], [Value])
VALUES
('EMP1', 'Mumbai', '1', 844.17769999999996),
('EMP1', 'Mumbai', 'abc', 837.43679999999995),
('EMP2', 'Mumbai', 'abc', 837.43679999999995)
声明:
SELECT DISTINCT p.[Name], p.[Location], c.Items
FROM People p
CROSS APPLY (
SELECT [TagName], [Value]
FROM People
WHERE [Name] = p.[Name] AND [Location] = p.[Location]
FOR JSON AUTO
) c (Items)
FOR JSON PATH
结果:
[
"Name":"EMP1",
"Location":"Mumbai",
"Items":[
"TagName":"1",
"Value":844.17769999999996
,
"TagName":"abc",
"Value":837.43679999999995
]
,
"Name":"EMP2",
"Location":"Mumbai",
"Items":[
"TagName":"abc",
"Value":837.43679999999995
]
]
如果要解析生成的JSON,需要使用OPENJSON()
两次:
生成的 JSON:
DECLARE @json varchar(max) = N'[
"Name":"EMP1",
"Location":"Mumbai",
"Items":[
"TagName":"1",
"Value":844.17769999999996
,
"TagName":"abc",
"Value":837.43679999999995
]
,
"Name":"EMP2",
"Location":"Mumbai",
"Items":[
"TagName":"abc",
"Value":837.43679999999995
]
]'
声明:
SELECT j1.Name, j1.Location, j2.TagName, j2.Value
FROM OPENJSON(@json) WITH (
[Name] varchar(10) '$.Name',
[Location] varchar(50) '$.Location',
[Items] nvarchar(max) '$.Items' AS JSON
) j1
OUTER APPLY OPENJSON(j1.Items) WITH (
[TagName] varchar(3) '$.TagName',
[Value] numeric(20, 14) '$.Value'
) j2
【讨论】:
这似乎是工作。谢谢你。如果可能的话,你能解释一下我们如何将上面的json转换成表格格式吗...?以上是关于如何在 json 根节点中添加键值对并使用 SQL Server 将其转换为表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中将键值对添加到类型为 [String:AnyObject] 的字典中?