У меня есть следующие данные в формате JSON в столбце («Данные»), который должен быть запрошен: Запись 1:
{
"actions":[
{
"class":"Action",
"entries":[
{
"class":"Entry",
"id":null,
"key":"StartTime",
"performance":{
"class":"Performance",
"origin":null,
"originUuid":null,
"performanceDateTime":1560858977855,
"performerUuid":{
"class":"java.util.UUID",
"UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
},
"registrationDateTime":null,
"userUuid":null
},
"type":"O",
"value":"\"2019-06-17T11:58:38.000Z\""
},
{
"class":"Entry",
"id":null,
"key":"StartedBy",
"performance":{
"class":"Performance",
"origin":null,
"originUuid":null,
"performanceDateTime":1560858977855,
"performerUuid":{
"class":"java.util.UUID",
"UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
},
"registrationDateTime":null,
"userUuid":null
},
"type":"C_R",
"value":"1019"
}
]
}
]
}
Запись 2:
{
"actions":[
{
"class":"Action",
"entries":[
{
"class":"Entry",
"id":null,
"key":"StartTime",
"performance":{
"class":"Performance",
"origin":null,
"originUuid":null,
"performanceDateTime":1560863293329,
"performerUuid":{
"class":"java.util.UUID",
"UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
},
"registrationDateTime":null,
"userUuid":null
},
"type":"O",
"value":null
},
{
"class":"Entry",
"id":null,
"key":"StopTime",
"performance":{
"class":"com.bma.common.dto.Performance",
"origin":null,
"originUuid":null,
"performanceDateTime":1560863293329,
"performerUuid":{
"class":"java.util.UUID",
"UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
},
"registrationDateTime":null,
"userUuid":null
},
"type":"O",
"value":"\"2019-06-18T13:08:42.000Z\""
},
{
"class":"Entry",
"id":null,
"key":"StartedBy",
"performance":{
"class":"Performance",
"origin":null,
"originUuid":null,
"performanceDateTime":1560858977855,
"performerUuid":{
"class":"java.util.UUID",
"UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e6"
},
"registrationDateTime":null,
"userUuid":null
},
"type":"C_R",
"value":"1018"
}
]
}
]
}
Что теперьМне нужно установить, есть ли время остановки для каждого времени запуска, чтобы определить, есть ли еще какие-либо текущие действия.Обратите внимание, что первая запись не имеет объекта с ключом StopTime.Есть также записи без ключа StartTime.И, см. Запись 2, объекты с ключом StartTime могут иметь нулевое значение.Это также относится к объектам с ключом StopTime.Я придумал следующий sql, который еще далек от завершения:
SELECT ca1.[value] AS StartTimeCol,
ca2.[value] AS StopTimeCol
FROM queriedTable qu
CROSS APPLY OPENJSON(qu.Data, '$.actions')
WITH (
entries nvarchar(max) '$.entries' AS JSON
) j
CROSS APPLY OPENJSON(j.entries)
WITH (
[key] nvarchar(100) '$.key',
[value] nvarchar(100) '$.value'
) ca1
CROSS APPLY OPENJSON(j.entries)
WITH (
[key] nvarchar(100) '$.key',
[value] nvarchar(100) '$.value'
) ca2
WHERE
ca1.[key] = 'StartTime' OR
ca2.[key] = 'StopTime'
Очевидно, я пришел к подсчету StartTimes и StopTimes;Что меня удивляет, так это то, что результат дает мне в столбцах StartTimeCol и StopTimeCol значения из других объектов, таких как «1019» и «1018», хотя я явно заявляю, что должны рассматриваться только ключи StartTime и StopTime.Как так?И как я могу установить в одном запросе, является ли количество StopTimes больше или равно количеству StartTimes?
Thx!