繁体   English   中英

从 mariadb 中的 json object 中提取感觉作为键值

[英]Extract feelds as key value from a json object in mariadb

您好,我想将 json object 的不同字段值提取为键值对,但我无法做到这一点。

我试过这个

SELECT JSON_EXTRACT(chapters, '$[*].Id', '$[*].Name') AS rec 
  FROM `Novels` 
 WHERE 1

但结果看起来像这样["1","first Name","2","second name"]

关于如何将其转换为类似{"1":"first Name","2":"second name"}的任何想法

提前致谢!

一种选择使用json_table()将数组取消嵌套到行(仅在 MySQL 8 中可用)然后聚合:

select 
    t.*,
    (
        select json_objectagg('id', x.id, 'name', x.name)
        from json_table(
            t.chapter,
            '$[*]' 
            columns (
                id int path '$.Id',
                name varchar(50) path '$.Name'
            )
        ) as x
    ) as obj
from mytable t

根据结果,章节列的相关值应为

'[ {"Id":"1","Name":"first name"}, {"Id":"2","Name":"second name"} ]'

JSON_EXTRACT()可以应用于数组的每个元素,以便将Id值确定为部分,将名称值确定为部分。

然后,可以应用JSON_UNQUOTE()来消除双引号,同时为每个单独的数组元素生成行。 JSON_OBJECTAGG用于在最后一步聚合所有提取的对象,前提是 MariaDB 版本为 10.5+:

WITH n AS
(
SELECT @i := @i + 1 AS rn, 
       JSON_UNQUOTE(JSON_EXTRACT(chapters, CONCAT('$[',@i-1,'].Id'))) AS js_id,
       JSON_UNQUOTE(JSON_EXTRACT(chapters, CONCAT('$[',@i-1,'].Name'))) AS js_name
  FROM information_schema.tables  
 CROSS JOIN ( SELECT @i := 0, chapters FROM `Novels` ) n
 WHERE @i < JSON_LENGTH(JSON_EXTRACT(chapters, '$[*]'))
)
SELECT JSON_OBJECTAGG(js_id,js_name) AS Result
  FROM n

可能会为 10.5 之前的数据库版本提供解决方法

SELECT CONCAT('{', 
       GROUP_CONCAT( 
                    REPLACE(
                            REPLACE( JSON_OBJECT(js_id,js_name) , '}', '') 
                            , '{', '')
                    )        
        , '}') AS Result
  FROM n

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM