问题描述
我正在尝试在Azure sql中使用OPENJSON解析json文件,但是我想在新表中进行特定的映射。 我有一个看起来像这样的json文件,其中包含许多y0_1,y0_2,.... y0_380。
{"proto": "01","type": "A","description": "heartbeat","geometry": {"y0_1": {"tag": "Normal","probability": 0.40,"x": 39,"y": 13},"y0_2": {"tag": "category_3","probability": 0.8,"x": 48,"y0_3": {"tag": "Normal","probability": 0.9,"x": 27,"y": 10},"Test": {"proba": 0.65}}}
我想解析json并创建一个具有以下格式的表: 我尝试使用Openjson格式解析json,但是我不知道如何在同一列中获取所有y和x,如链接中的图片
SELECT * from OPENROWSET (
BULK 'sample.json',DATA_SOURCE ='dataset',FORMATFILE_DATA_SOURCE = 'myblobstorage',SINGLE_CLOB
) AS J
CROSS APPLY OPENJSON (BulkColumn)
WITH (
proto nvarchar(100) N'$.proto',description nvarchar(100) N'$.description',)
解决方法
使用OPENJSON
,AS JSON
数据类型和CROSS APPLY
来深入到JSON的不同层。我创建了一个简化的示例来展示该技术:
DECLARE @json NVARCHAR(MAX) = '{
"proto": "01","type": "A","description": "heartbeat","geometry": {
"y0_1": {
"tag": "Normal","probability": 0.40,"x": 39,"y": 13
},"y0_2": {
"tag": "category_3","probability": 0.8,"x": 48,"y0_3": {
"tag": "Normal","probability": 0.9,"x": 27,"y": 10
},"Test": {
"proba": 0.65
}
}
}'
SELECT
j.proto,j.[type],j.[description],JSON_VALUE ( g.[value],'$.tag' ) AS tag,'$.probability' ) AS probability,'$.x' ) AS x,'$.y' ) AS y
FROM OPENJSON( @json,'$' )
WITH (
proto VARCHAR(50),[type] VARCHAR(50),[description] VARCHAR(50),[geometry] NVARCHAR(MAX) AS JSON
) j
CROSS APPLY OPENJSON ( [geometry] ) g
我的结果: