我有一个json类型列config
我想添加一个键值对,最终看起来像:
{
"features": {
"divisions": true,
"utilities": {
"water": true,
"gas": true,
"electric": true
}
}
}
我遇到的问题是当我想在功能中插入实用程序对象时,我要么覆盖divisions
键值,要么我返回NULL
并且<{1}}对象未被插入。
此外,utilities
列可能是config
或最初只是空NULL
。
此查询将检查NULL或空{}以及{}
密钥是否存在但如果已存在则会覆盖features
:
features
除非该列已经包含以下内容:
,否则此工作正常UPDATE entities SET config = JSON_SET(COALESCE(config, '{}'),
COALESCE("$.features", "features"), JSON_OBJECT("utilities",
JSON_OBJECT("water", TRUE, "gas", TRUE, "electric", TRUE)))
WHERE id = 123725082;
在其中用{
"features": {
"divisions": true,
}
}
对象覆盖divisions
。
所以我尝试了一个JSON_INSERT查询;从我从mysql json函数文档中收集的文档应该可以工作,但是它返回null并且我无法理解为什么:
utilities
答案 0 :(得分:4)
JSON_MERGE函数非常有用。
根据需要修改UPDATE
:
UPDATE `entities`
SET `config` = COALESCE(
JSON_MERGE(
`config`,
JSON_OBJECT('features',
JSON_OBJECT('utilities',
JSON_OBJECT('water', TRUE, 'gas', TRUE, 'electric', TRUE)
)
)
),
JSON_INSERT(
JSON_OBJECT(),
'$.features',
JSON_OBJECT('utilities',
JSON_OBJECT('water', TRUE, 'gas', TRUE, 'electric', TRUE)
)
)
);
请参阅db-fiddle。