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