Json

MySQL 5.7 JSON_MERGE 與 GROUP_CONCAT 結合

  • July 27, 2019

我們有一個帶有 JSON 列的表,例如簡單:

{"a": 1}
{"b": 2}

執行 JSON_MERGE 查詢

select JSON_MERGE('{"a": 1}','{"b": 2}')

結果正確:

{"a": 1, "b": 2}

執行 GROUP_CONCAT 查詢

select GROUP_CONCAT('\'',json_text,'\'') from t_json

結果

'{"a": 1}','{"b": 2}'

但如果嘗試將它們結合起來:

SELECT JSON_MERGE((select GROUP_CONCAT('\'',json_text,'\'') from t_json))

返回錯誤:

Incorrect parameter count in the call to native function 'JSON_MERGE'

從組操作中合併 JSON 文件的任何方法?

使用字元串函式組裝所需的 JSON,然後將其轉換為 JSON。

範例數據

create table item (itemName varchar(200), itemProperties json);

insert into item values
('sword', '{"damage": 20, "durability": 300}'),
('magical sword', '{"damage": 30, "magical damage": {"fire": 5},
                   "durability": 400}'),
('dummy', '{}'),
('spellbook', '{"spell": "lightning bolt", "charge": 10}');

查詢合併itemProperties在一起

select cast(
 concat('{',  -- wrap everything in root object '{ ... }'
   group_concat(
     -- strip parenthesis from individual item representation
     -- '{"foo": 1}' -> '"foo": 1'
     substring(itemProperties, 2, length(itemProperties) - 2)),
 '}')
as json) allProperties
from item
-- skip empty JSON values to avoid getting extra comma during 
-- group_concat
where itemProperties != JSON_OBJECT();

生成的 JSON

{
 "spell": "lightning bolt",
 "charge": 10,
 "damage": 20,
 "durability": 300,
 "magical damage": {
   "fire": 5
 }
}

幾個警告:

  • 此程式碼段的行為與 不同JSON_MERGE(),例如:

    • 當兩個或多個屬性具有相同名稱時,它們的值將被覆蓋而不是合併到值數組中
    • 它不能將對象與數組合併
  • 所提供的解決方案僅適用於作為頂級實體的對象,而不適用於數組。可以修改它以使用數組。

  • 如果依賴於以花括號開頭和結尾的 JSON 對象的字元串表示{}。這可能會在伺服器的未來版本中發生變化。

這會工作嗎?:

CONCAT("[", GROUP_CONCAT(CAST(json_text AS JSON)),"]")

我使用以下內容來建構對像數組:

CONCAT("[", GROUP_CONCAT(JSON_OBJECT("tbl", assoc.tbl_child, "id", assoc.id_child)), "]")

引用自:https://dba.stackexchange.com/questions/153000