我有一个很大的 JSON 字段,我正在尝试使用 JSON_TABLE 解析它。 大约一半的数据很简单,例如:
"run_summary":{"num_records":6,"num_runtime_errors":0,"num_checkpoint_failed":4,"num_files":4}
但另一半包含转义引号,例如:
"current_review_id":"{\"value\": \"b13d2f43-7abb-40f8-9867-6349c0c84c47\", \"recorded_timestamp\": 1696865721868}"
我可以轻松地从 run_summary 中分解列,即
num_records int PATH '$.run_summary.num_records'
但是,我不知道如何获取转义引号内的内容......这不起作用,例如:
value varchar(40) PATH '$.flow_job_metrics.current_review_id.value'
...它只返回 null。
我尝试在路径中添加额外的引号,例如:
'$.flow_job_metrics.current_review_id."value"'
以及其他疯狂的事情,例如:
'$.flow_job_metrics.current_review_id.\"value\"'
但是这些要么会导致语法错误,要么会导致更多空值。
任何人都可以帮我弄清楚如何获得这些吗?
由于 JSON 实际上是双重编码的,也就是说,您的 JSON 的一部分只是一个字符串,它是“外部”JSON 文档的一部分,因此您必须对其进行双重解码:
create table mytable (
id serial primary key,
data json
);
insert into mytable set data = '{"current_review_id":"{\\"value\\": \\"b13d2f43-7abb-40f8-9867-6349c0c84c47\\", \\"recorded_timestamp\\": 1696865721868}"}';
select id, j1.current_review_id, j2.value, j2.recorded_timestamp from mytable
cross join json_table(data, '$' columns (
current_review_id json path '$.current_review_id'
)) as j1
cross join json_table(json_unquote(j1.current_review_id), '$' columns (
value varchar(36) path '$.value',
recorded_timestamp bigint path '$.recorded_timestamp'
)) as j2;
输出,在 MySQL 8.4.3 上测试:
*************************** 1. row ***************************
id: 1
current_review_id: "{\"value\": \"b13d2f43-7abb-40f8-9867-6349c0c84c47\", \"recorded_timestamp\": 1696865721868}"
value: b13d2f43-7abb-40f8-9867-6349c0c84c47
recorded_timestamp: 1696865721868