sql - 如何将嵌套的 JSON 导入 SQL Server 表?
问题描述
我有一个嵌套的 JSON 变量(我在这里使用缩短的版本),我想将它插入到表中。我可以不使用嵌套的列和值,但可以使用嵌套部分。我想要的是检索 2 行:一个用于 sessionID = 20,另一个用于 30 的子列。我正在使用 SQL Server 2017。
DECLARE @json NVARCHAR(MAX)
SET @json =
N'{
"List":
[
{
"ID": 13,
"Date": "2015-12-07",
"SessionID": {
"20": {
"discount": "no",
"price": 15.99
},
"30": {
"discount": "yes",
"price": 12.99
}
}
}
]
}'
SELECT *
FROM OPENJSON(@json, N'lax $.List')
WITH (ID int '$.ID'
,[Date] date '$.Date'
,SessionID nvarchar(max) N'lax $.SessionID' AS JSON
)
我想检索如下数据。提前感谢您的帮助!
解决方案
正如 Zohard Peled 告诉您的,JSON 的内部结构需要改进。一般来说,将数据作为元素名称放置并不是一个好主意。最好使用类似的东西"SessionID":"20"
,而您的 JSON 会提供"20"
以下对象的 as 名称。
尽管如此,这可以使用以下列来key
完成OPENJSON
:
DECLARE @json NVARCHAR(MAX)
SET @json =
N'{
"List":
[
{
"ID": 13,
"Date": "2015-12-07",
"SessionID": {
"20": {
"discount": "no",
"price": 15.99
},
"30": {
"discount": "yes",
"price": 12.99
}
}
}
]
}'
--查询将逐步遍历您的结构:
SELECT B.ID
,B.[Date]
,C.[key] AS SessionID --here's the magic...
,JSON_VALUE(C.[value],'$.discount') AS discount
,JSON_VALUE(C.[value],'$.price') AS price
FROM OPENJSON(@json)
WITH(List NVARCHAR(MAX) AS JSON) A --getting "List" as JSON
CROSS APPLY OPENJSON(A.List)
WITH(ID INT
,[Date] DATE
,SessionID NVARCHAR(MAX) AS JSON) B --getting "ID" and "Date" and "SessionID as JSON
CROSS APPLY OPENJSON(B.SessionID) C; --get the objects within the array, but nameless...
结果:
ID Date SessionID discount price
13 2015-12-07 20 no 15.99
13 2015-12-07 30 yes 12.99
推荐阅读
- powershell - 我想检查进程是否处于理想状态
- mysql - 为什么我们应该在 SQL 中的 HAVING 子句后跟 GROUP BY 并在 ORDER BY 语句之前
- vb.net - 我如何增大自动完成自定义源文本框 Vb.NET 的字体大小
- java - 如何使用 Selenium WebDriver + Java 获取浏览器实例的 PID?
- python-3.x - 如何使用 Python 提取点的 x 坐标
- php - 如何不在 php 中显示 cURL 响应数据?
- php - 使用 Embed api 到本地仪表板
- ios - 在 React-native for IOS 中禁用屏幕截图
- java - 这个程序的运行时和空间复杂度是多少?
- java - 通过使其返回 Observable 来使 Singleton 的 getInstance() 方法异步是个好主意吗
?