首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Mariadb中有效地模拟JSON_TABLE?

问如何在Mariadb中有效地模拟JSON_TABLE?
EN

Database Administration用户
提问于 2020-12-21 15:41:07
回答 1查看 646关注 0票数 0

我没有现成的MySql,但据我所知,在MySql中实现我想要的东西的最好方法是使用JSON_TABLE。而且,据我所知,JSON_TABLE现在正在成为非常积极地工作,这降低了只为这个目的切换到MySql的愿望。

我有一个关于查询的工作,它给了我我想要的东西,但是想知道它是否是最有效的方法。

代码语言:javascript
复制
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行,但是在不对元素的最大数量进行假设的情况下,一般推荐的方法是什么。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-12-21 16:05:08

我在玩我的查询然后想出了这个。比以前要快得多。如此之多,我认为这可能是最好的方式做这样的事情。

代码语言:javascript
复制
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

我会暂时不接受这个答案,以防其他人可以提供替代方案。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/281954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档