我有一个可以为JSON类型的可空列:
CREATE TABLE mytable (mycolumn JSON);
我想要做的是跟踪数组中的事件,并将每个事件保存在此数组中的对象形式中。三个事件被推入阵列后,所需的mycolumn
内容将是:
[
{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"]},
{"product": ["book"], "subgenre": ["space"], "genre": ["fiction"]},
{"product": ["book"], "genre": ["romance"]},
]
对象的形状是无关紧要和未知的(以上只是示例)。唯一已知的是每个事件都是一个至少有一个属性的对象。属性是数组,对象,标量,字符串或null是未知的。
该列最初将为null,我的测试显示我需要将其合并为一个数组或推入它将失败。
我最接近完成这项工作的是:
UPDATE
mytable
SET
mycolumn = JSON_ARRAY_APPEND (
COALESCE (mycolumn, '[]'),
'$',
(
'{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}'
)
);
问题是这个查询将整个对象解释为一个字符串,我最终得到一个字符串数组而不是一个对象数组:
SELECT mycolumn FROM mytable;
[
"{\"product\":[\"book\"],\"subgenre\":[\"scifi\"],\"genre\":[\"fiction\"]}",
"{\"product\":[\"book\"],\"subgenre\":[\"space\"],\"genre\":[\"fiction\"]}",
"{\"product\":[\"book\"],\"genre\":[\"romance\"]}"
]
在我看来你想要使用像JSON_MERGE_PRESERVE
函数,而不是JSON_ARRAY_APPEND
函数。
后者将第三个参数作为值进行评估,它不会将第三个参数作为JSON文档进行评估。
在所示的UPDATE
声明中,围绕第三个参数(对JSON_ARRAY_APPEND
)的虚假parens没有任何意义。第三个参数只是一个值。该值是一个看起来像JSON的长字符串,但在这种情况下,它只是一个字符串。
参考:https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html#function_json-array-append
我建议测试和开发表达式...使用SELECT
语句更容易,更快捷。一旦我们有表达式返回预期/期望的结果,那么我们可以将表达式移动到UPDATE
语句中。
cast('{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}' as json)
这是一个类似的问题: