如何按键从 JSON 字符串中提取值
How to extract a value from a JSON string by key
我有一列有 Json 字符串记录。我想解析 json 并从 select 语句中获取特定键的值。
示例 JSON
{"kofaxDocId":"8ae16f46-c68f-11e5-8105-0e15fb39b661","systemDocType":"Loan Application","requestId":"c770a940-b9f3-4c41-aee6-3e08c1470ec6","docType":"Loan Application","confidence":0.6499999761581421,"engineType":"kofax","completionStatus":"Suggested"}
我希望我的 select 查询仅获取键 "confidence" 的值。我尝试使用 Regex 和 Substring,但由于 json 长度不固定,因此无法为所有记录获取正确的值。
我试过这些
SELECT substring(extended_metadata, ('"confidence":', extended_metadata )) FROM documents ;
SELECT json_extract(extended_metadata,'confidence') CONFIDENCE from documents;
我的 MYSQL 版本不支持 Json_extract()。
感谢帮助。
MySQL 在 5.7.7 http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/
版本中获得了对 JSON 的支持
你必须纯粹在 mysql 中解决它然后恐怕你必须将它视为一个字符串并从中删除值(只是普通的字符串函数或使用正则表达式)这不是优雅的但它会起作用
CREATE TABLE testjson (`jsonfield` varchar(2000)) ;
INSERT INTO testjson (`jsonfield`) VALUES ('{"kofaxDocId":"8ae16f46-c68f-11e5-8105-0e15fb39b661","systemDocType":"Loan Application","requestId":"c770a940-b9f3-4c41-aee6-3e08c1470ec6","docType":"Loan Application","confidence":0.6499999761581421,"engineType":"kofax","completionStatus":"Suggested"}') ;
SELECT substring(jsonfield, locate('"confidence":',jsonfield)+13, locate(',"', jsonfield, locate('"confidence":',jsonfield))-locate('"confidence":',jsonfield)-13) as confidence_value
FROM testjson;
此查询在您的 jsondata 中搜索 Confidence,然后查看 confidence 之后的下一个分隔符,并减去这两个索引之间的内容。
这是上面示例的 SQL fiddle:http://sqlfiddle.com/#!9/2edfaf/3/0
我不得不更改 Kobi 的脚本,因为如果值在 JSON 文件的末尾,子字符串会失败,因为它正在寻找“,”。这个脚本将提取一个字符串。
将脚本中的 15 替换为列标题的长度。 (即 =“referred-by”:)
将“referred-by”替换为列标题。
SELECT substring(jsonfield, locate('"referred-by":',jsonfield)+15, (locate('"', jsonfield, locate('"referred-by":',jsonfield)+15))-(locate('"referred-by":',jsonfield)+15)) as referredby
我有一列有 Json 字符串记录。我想解析 json 并从 select 语句中获取特定键的值。
示例 JSON
{"kofaxDocId":"8ae16f46-c68f-11e5-8105-0e15fb39b661","systemDocType":"Loan Application","requestId":"c770a940-b9f3-4c41-aee6-3e08c1470ec6","docType":"Loan Application","confidence":0.6499999761581421,"engineType":"kofax","completionStatus":"Suggested"}
我希望我的 select 查询仅获取键 "confidence" 的值。我尝试使用 Regex 和 Substring,但由于 json 长度不固定,因此无法为所有记录获取正确的值。
我试过这些
SELECT substring(extended_metadata, ('"confidence":', extended_metadata )) FROM documents ;
SELECT json_extract(extended_metadata,'confidence') CONFIDENCE from documents;
我的 MYSQL 版本不支持 Json_extract()。
感谢帮助。
MySQL 在 5.7.7 http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/
版本中获得了对 JSON 的支持你必须纯粹在 mysql 中解决它然后恐怕你必须将它视为一个字符串并从中删除值(只是普通的字符串函数或使用正则表达式)这不是优雅的但它会起作用
CREATE TABLE testjson (`jsonfield` varchar(2000)) ;
INSERT INTO testjson (`jsonfield`) VALUES ('{"kofaxDocId":"8ae16f46-c68f-11e5-8105-0e15fb39b661","systemDocType":"Loan Application","requestId":"c770a940-b9f3-4c41-aee6-3e08c1470ec6","docType":"Loan Application","confidence":0.6499999761581421,"engineType":"kofax","completionStatus":"Suggested"}') ;
SELECT substring(jsonfield, locate('"confidence":',jsonfield)+13, locate(',"', jsonfield, locate('"confidence":',jsonfield))-locate('"confidence":',jsonfield)-13) as confidence_value
FROM testjson;
此查询在您的 jsondata 中搜索 Confidence,然后查看 confidence 之后的下一个分隔符,并减去这两个索引之间的内容。
这是上面示例的 SQL fiddle:http://sqlfiddle.com/#!9/2edfaf/3/0
我不得不更改 Kobi 的脚本,因为如果值在 JSON 文件的末尾,子字符串会失败,因为它正在寻找“,”。这个脚本将提取一个字符串。
将脚本中的 15 替换为列标题的长度。 (即 =“referred-by”:)
将“referred-by”替换为列标题。
SELECT substring(jsonfield, locate('"referred-by":',jsonfield)+15, (locate('"', jsonfield, locate('"referred-by":',jsonfield)+15))-(locate('"referred-by":',jsonfield)+15)) as referredby