如何在mysql表中读取这种类型的json对象

q9rjltbz  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(357)


我在mysql表中有这种类型的json数据。我怎么看

[
    {
        "price": "1000",
        "itemcode": "1",
        "itemname": "Break Pads",
        "quantity": "1"
    },
    {
        "price": "800",
        "itemcode": "3",
        "itemname": "Break Oil",
        "quantity": "1"
    }
]
xhv8bpkk

xhv8bpkk1#

在MySQL5.7中,其中 JSON_TABLE() 不可用,典型的解决方案使用数字表。

select
    d.*,
    json_unquote(json_extract(
        d.items,
        concat('$[', n.i, '].price')
    )) price,
    json_unquote(json_extract(
        d.items,
        concat('$[', n.i, '].itemcode')
    )) itemcode,
    json_unquote(json_extract(
        d.items,
        concat('$[', n.i, '].itemname')
    )) itemname,
    json_unquote(json_extract(
        d.items,
        concat('$[', n.i, '].quantity')
    )) quantity
from deals d
inner join (
    select 0 i 
    union all select 1
    union all select 2
    union all select 3
) n
    on n.i < json_length(d.items)

每个数组最多可处理4个对象。如果需要更多,可以使用更多 union all s。

o3imoua4

o3imoua42#

一种模拟的变通方法 JSON_TABLE() ,它存在于版本8.0中,可以作为

SELECT JSON_UNQUOTE(JSON_EXTRACT(jsdata, CONCAT('$[',@rn+1,'].price'))) AS price,
       JSON_UNQUOTE(JSON_EXTRACT(jsdata, CONCAT('$[',@rn+1,'].itemcode'))) AS itemcode,
       JSON_UNQUOTE(JSON_EXTRACT(jsdata, CONCAT('$[',@rn+1,'].itemname'))) AS itemname,
       JSON_UNQUOTE(JSON_EXTRACT(jsdata, CONCAT('$[',@rn+1,'].quantity'))) AS quantity,
       @rn :=  @rn + 1 as rn
  FROM tab
 CROSS JOIN (SELECT @rn := -1
               FROM information_schema.tables) AS iter 
 WHERE @rn < JSON_LENGTH(JSON_EXTRACT(jsdata, '$[*]')) - 1

演示

相关问题