我没有现成的MySql,但据我所知,在MySql中实现我想要的东西的最好方法是使用JSON_TABLE。而且,据我所知,JSON_TABLE现在正在成为非常积极地工作,这降低了只为这个目的切换到MySql的愿望。
我有一个关于查询的工作,它给了我我想要的东西,但是想知道它是否是最有效的方法。
create table natural_numbers (primary key (n))
with recursive nn as (
select 0 as n
union
select n + 1
from nn
where nn.n < 100
)
select *
from nn;
with all_values as (
select json_value(pr.record_data, concat('$.*.A.B.C[',nn.n,'].D.*')) x
from xxx pr
cross join natural_numbers nn
)
select *
from all_values a
where a.x is not null
;我对此的关注是,我正在构建比我需要的更多的行,然后过滤掉空。在这种特殊情况下,我认为不太可能有超过6个元素,所以我最多可以将过程限制为6行,但是在不对元素的最大数量进行假设的情况下,一般推荐的方法是什么。
发布于 2020-12-21 16:05:08
我在玩我的查询然后想出了这个。比以前要快得多。如此之多,我认为这可能是最好的方式做这样的事情。
with recursive array_values as (
select
json_extract(pr.record_data, '$.*.A.B.C[*].D.*') val
, pr.id
, json_length(json_extract(pr.record_data, '$.*.A.B.C[*].D.*')) n
from xxx pr
), rec_elems as (
select av.id, 0 as i, json_value(av.val, '$[0]') val
from array_values av
where av.n > 0 is not null
union all
select av.id, e.i + 1, json_value(av.val, concat('$[', e.i + 1, ']'))
from array_values av
inner join rec_elems e on av.id = e.id
where (i + 1) < av.n
)
select * from rec_elems我会暂时不接受这个答案,以防其他人可以提供替代方案。
https://dba.stackexchange.com/questions/281954
复制相似问题