У меня есть показанный здесь JSON, хранящийся в столбце таблицы SQL Server:
{
"Name": "oxygen",
"StartDate": "2018-06-05",
"EndDate": "2018-06-22",
"Desc": {
"quality": "better",
"level,amount": "Scheduled",
"05": "carbon",
"GDP": "Max",
"CDF": "ZENE 1",
"OTBC": "REMO - MIXED UNIQUE"
}
}
Как найти значение 5-й пары ключей с помощью запроса T-SQL?
Я пробовал это:
select JSON_QUERY(column_value,'$.Desc[5]') AS 'result'
from table_name
select JSON_VALUE([column_value],'$.Desc[5]') as'result'
from table_name
Ожидаемый результат "CDF": "ZENE 1"
.
Любая помощь приветствуется.
Не уверен, что есть простой способ, поскольку порядок ключей не является тем, что OPENJSON сообщает для объектов json, но вот одна идея:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER(partition BY ID ORDER BY charindex('"' + [key] + '":', column_value)) AS sort
, *
FROM (
SELECT N'{
"Name": "oxygen",
"StartDate": "2018-06-05",
"EndDate": "2018-06-22",
"Desc": {
"quality": "better",
"level,amount": "Scheduled",
"05": "carbon",
"GDP": "Max",
"CDF": "ZENE 1",
"OTBC": "REMO - MIXED UNIQUE"
}
}' AS column_value, 1 AS id
) x
CROSS apply openjson(column_value, '$.Desc')
) x
WHERE sort = 5
После разделения значения столбца по ключам Desc я использую ROW_NUMBER, чтобы проверить положение каждой ключевой строки внутри строки json, а затем использую ее в качестве базы для счетчика, который возвращает пятое значение.
Недостатком этого подхода является то, что он использует строковые методы, которые могут быть медленными и несколько хрупкими.
Вероятно, это первый вариант. Одна из возможных проблем — экранированный контент JSON (... "\"CDF": "Max" ...
).