Как я могу прочитать этот тип json объектов в моей sql таблице - PullRequest
0 голосов
/ 29 мая 2020

enter image description here

У меня есть данные этого типа json в таблице mysql. как их прочитать

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

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Обходной путь, эмулирующий JSON_TABLE(), который существует в версии 8.0, может быть указан для DB 5.7 как

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 

Демо

0 голосов
/ 29 мая 2020

В MySQL 5.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.

...