问题描述
这是我声明的json:
DECLARE @json VARCHAR(MAX) = N'
[
{
"mTruckId": -35839339,"mPositionId": 68841545,"mPositionDateGmt": "laboris ipsum ullamco","mLatitude": -36598160.205007434,"mLongitude": 54707169.834195435,"mGpsValid": false,"mheading": 114,"mSpeed": -888256.4982997179,"mAdditionalinformation": {
"mVin": "voluptate veniam","modometer": 25567959.615529776,"mEngineHours": -87509827.08880372,"mTemperatureSensors": [
{
"munit": "C","mLabel": "aute in","mValue": -74579140.64111689
},{
"munit": "C","mLabel": "ullamco labore dolore","mValue": -91870052.84894001
}
]
}
},{
"mTruckId": 80761376,"mPositionId": 88380593,"mPositionDateGmt": "sed pariatur ut sint","mLatitude": 62504812.42302373,"mLongitude": 14622406.17103973,"mheading": 302,"mSpeed": 39030054.634676635,"mAdditionalinformation": {
"mVin": "aute","modometer": 74400412.05641022,"mEngineHours": 88453976.08453897,"mTemperatureSensors": [
{
"munit": "F","mLabel": "reprehenderit consectetur id ipsum","mValue": 22634605.53841141
},"mLabel": "magna consectetur esse","mValue": 72633803.44269562
}
]
}
}
]'
这是我的代码,用于从json中提取温度传感器数据。我认为这样做会成功,因为获取温度传感器数据的json层次结构是root-> mAdditionalinformation-> mTemperatureSensors。
SELECT Unit,Label,Value
FROM OPEnjsON(@json)
WITH(
Unit VARCHAR(15) '$.mAdditionalinformation.mTemperatureSensors.munit',Label VARCHAR(50) '$.mAdditionalinformation.mTemperatureSensors.mLabel',Value FLOAT '$.mAdditionalinformation.mTemperatureSensors.mValue'
)
它返回两行均为空的行,为什么这样做呢?我希望它能够提取mTemperatureSensors数据中的每个元素。
Unit Label Value
NULL NULL NULL
NULL NULL NULL
解决方法
select s.*
from openjson(@json)
with
(
mTemperatureSensors nvarchar(max) '$.mAdditionalInformation.mTemperatureSensors' as json
) as t
cross/*outer*/ apply openjson(t.mTemperatureSensors)
with
(
mLabel nvarchar(20)
) as s
,
将 @json 的内容插入到表格中之后,一个选项是逐步应用OPENJSON
到CROSS APPLY
({{ 1}}):
tab
或根据您的情况声明标量变量 @json :
SELECT Unit,Label,Value
FROM tab
CROSS APPLY OPENJSON(JsonData)
WITH (
TempSens NVARCHAR(MAX) '$.mAdditionalInformation.mTemperatureSensors' AS JSON ) Q1
CROSS APPLY OPENJSON (Q1.TempSens)
WITH (
Unit NVARCHAR(MAX) '$.mUnit',Label NVARCHAR(MAX) '$.mLabel',Value FLOAT '$.mValue'
) Q2