[英]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.