#json #sql-server #blockchain #sql-server-2019
#json #sql-сервер #блокчейн #sql-server-2019
Вопрос:
У меня есть таблица со столбцом JSON. в этом столбце у меня есть хэш-данные блокчейна. например, этот JSON:
{ "017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894": {
"transaction": {
"block_id": 648895,
"id": 568135560,
"hash": "017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894",
"date": "2020-01-14",
"time": "2020-01-14 11:37:37",
"size": 198,
},
"inputs": [
{
"block_id": 648859,
"transaction_id": 567456558,
"index": 4,
"transaction_hash": "8aa2c6c9a804mate29790e03fac462782d99f16614732f82a5214786926e1397",
"date": "2020-01-13",
"time": "2020-01-13 23:15:37",
"value": 300830,
"value_usd": 33.2264,
"recipient": "1LcrmomE74BPzBTdduE8WHU2ox4QAFEpQi",
}
],
"outputs": [
{
"block_id": 648445,
"transaction_id": 568146680,
"index": 0,
"transaction_hash": "017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894",
"date": "2020-01-14",
"time": "2020-01-14 11:37:37",
"value": 300048,
"value_usd": 31.9397,
"recipient": "12UJZqf4sDGRNb9uYBABJkMyX91iLjDViT",
}
]}}
Я использовал следующий запрос:
SELECT *, JSON_VALUE(d.json_data,'$.017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894.transaction.size') as jj
FROM BlockChain as d
но у меня ошибка
Сообщение 13607, уровень 16, состояние 4, строка 39 Путь JSON неправильно отформатирован. В позиции 2 обнаружен неожиданный символ ‘0’.
У кого-нибудь есть идеи?
Ответ №1:
Путь
'$.017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894.transaction.size'
не может иметь узел, начинающийся с 0. Поэтому заключите его в кавычки:
'$."017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894".transaction.size'
.
У вас также есть проблема с вашим фактическим JSON, поскольку он имеет конечные запятые, что не поддерживается ни в SQL Server, ни в подавляющем большинстве анализаторов и браузеров, поскольку это противоречит спецификации.
Если у вас разные имена ключей для каждого значения, вам нужно разбить JSON с помощью OPENJSON
:
SELECT b.*, j.[key] AS hash, JSON_VALUE(j.value,'$.transaction.size') as jj
FROM BlockChain as d
CROSS APPLY OPENJSON(d.json_data) AS j
Комментарии:
1. с этим ‘$.»017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894″.transaction.size» к сожалению, возвращает null!!
2. Вы уверены, что это точное совпадение по этому ключу?
3. извините. ваш ответ правильный. Я вызываю ‘$.»017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894″.транзакция, которая возвращает null. но ‘$.»017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894″.transaction.size возвращает правильный ответ.
4. Внесли дополнительные обновления для изменения хэш-ключей