【问题标题】:Extract Values from key and array on JSON从 JSON 上的键和数组中提取值
【发布时间】:2021-06-10 22:00:18
【问题描述】:

如何在json上提取键和数组中的值

json

{
    "key1": "US",
    "key2": "545644566",
    "car": ["HONDA","TOYOTA","FORD"]
}

预期的结果:

key value
key1 US
key2 545644566
car HONDA
car TOYOTA
car FORD

我尝试使用:

SELECT JSON_EXTRACT(u.json, CONCAT('$.','"',g.field_name,'"')),g.*
  FROM table_json u
  LEFT JOIN table_column g 
    ON JSON_CONTAINS(JSON_KEYS(u.json), JSON_QUOTE(g.field_name), '$')

【问题讨论】:

    标签: mysql arrays json


    【解决方案1】:

    您可以使用字典表(例如information_schema.tables)以及迭代某些变量的索引值,以便为数组的元素生成行。以下代码也适用于不需要条件的非数组元素。应用JSON_KEYS()函数推导出第一个子查询中的关键元素,然后对各个索引使用JSON_EXTRACT()推导出最后一个子查询中数组的对应值如

    WITH t1 AS
    (
    SELECT @i := @i + 1 AS i, 
           JSON_UNQUOTE(JSON_EXTRACT(kys, CONCAT('$[', @i - 1, ']'))) AS `key`,
           JSON_EXTRACT(json,
                             CONCAT('$.',
                                          JSON_EXTRACT(kys, CONCAT('$[', @i - 1, ']'))
                                          )
                            ) AS value, kys
      FROM t
      JOIN (SELECT @i := 0, JSON_KEYS(json) AS kys FROM t) AS k
      JOIN information_schema.tables
    )
    SELECT @k := IF(@j=`key`,@k + 1,0) AS `index`,
           @j := `key` AS `key`,
           JSON_UNQUOTE(JSON_EXTRACT(value, CONCAT('$[', @k, ']'))) AS value
      FROM t1
      JOIN (SELECT @k := 0 ) AS k
      LEFT JOIN information_schema.tables
        ON @k < JSON_LENGTH(value) - 1
     WHERE value IS NOT NULL 
    

    Demo

    【讨论】:

    • 完美!!!我不会想出这个解决方案。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多