簡體   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