Json
MySQL 5.7 JSON_MERGE 與 GROUP_CONCAT 結合
我們有一個帶有 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)), "]")