Query-Performance

如何在 Mariadb 中有效地模擬 JSON_TABLE?

  • December 21, 2020

我沒有現成的 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 行,但一般推薦的方法是什麼而不對最大元素數。

我正在玩弄我的查詢並想出了這個。它比我以前的要快得多。如此之多,以至於我認為這可能是做此類事情的最佳方法。

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