Как исправить путь JSON_VALUE SQL-сервера с ошибкой «-»

Я пытаюсь получить значения полей в sql типа JSON. к сожалению, путь имеет «-», поэтому я получаю сообщение об ошибке, когда пытаюсь получить значение.

field->** **{"Con":["AA"],"X-Location-Latitude":["55.06"]}

Когда я пытаюсь получить значение json с запросом ниже

SELECT JSON_VALUE(field, '$.X-Location-Latitude') 
FROM table

я получаю эту ошибку

Путь Json неправильно отформатирован, обнаружен неожиданный символ «-»

Я также попытался добавить двойные кавычки как

SELECT JSON_VALUE(field, '$."X-Location-Latitude"') 
FROM table

и это вернуло NULL.

у кого-нибудь есть решение?


person Zeir    schedule 26.10.2020    source источник
comment
Я также пытался добавить двойные кавычки – у меня работает – проверьте ваш JSON действительно содержит скалярное значение в этом месте   -  person Caius Jard    schedule 26.10.2020
comment
Он имеет значение X-Location-Latitude:[55.06]   -  person Zeir    schedule 26.10.2020
comment
@Zeir Ты пробовал скобки? [X-местоположение-широта]   -  person eshirvana    schedule 26.10.2020
comment
"[55]" совершенно отличается от ["55"]...   -  person Caius Jard    schedule 26.10.2020
comment
@CaiusJard да заметил это, спасибо за ваш комментарий и отредактировал сразу после   -  person Zeir    schedule 26.10.2020


Ответы (2)


Итак, вы изначально написали:

field-> {"Con":"[AA]","X-Location-Latitude":"[55]"}

"[55]" — это одна строка длины 4; '$."X-Location-Latitude"' является правильным для этого единственного значения.


Теперь я вижу, что вы изменили его на:

{"Con":["AA"],"X-Location-Latitude":["55.06"]}

["55.06"] — это совершенно другое (и не из-за .06); это массив строк с одним элементом "55.06". В этом вся разница с JSON_VALUE.

JSON_VALUE нельзя использовать с путем, который выбирает массив; вам нужно будет указать одно значение в массиве, например:

SELECT JSON_VALUE(field, '$."X-Location-Latitude"[0]') FROM table
                                                 ^^^
                                          first array element

JSON_VALUE должен использоваться со скалярными свойствами (с одним значением), а не с коллекциями/массивами (элементы, заключенные в []) или сложные объекты (элементы, заключенные в {}).

В прекрасном руководстве есть хорошая таблица о том, что происходит, когда вы пытаетесь выбрать различные вещи с помощью JSON_VALUE в слабом и строгом режимах.

person Caius Jard    schedule 26.10.2020

Замена JSON_VALUE на JSON_QUERY устранила мою проблему.

Итак, ниже код работает нормально

SELECT JSON_QUERY(field, '$."X-Location-Latitude"') FROM table 

Возвращает [55.06]

person Zeir    schedule 26.10.2020