Mysql字段类型JSON,嵌套JSON为空设置嵌套JSON的值
版权声明:本文为砷碲原创文章,未经允许,禁止转载本文链接:https://sdpro.top/blog/html/article/1106.html
专栏收录该内容
Hi I'm Shendi
在 Mysql 中,字段类型为 JSON,如果有嵌套JSON,那么不能直接使用 JSON_SET 设置嵌套的内容,设置会不生效,可以使用 CASE WHEN 的形式
问题示例
首先建一个表,有一个字段 param 为 JSON 类型
CREATE TABLE shendi(param JSON);
一般在 INSERT 数据的时候会将 JSON 字段设置为 {}
JSON字段不能使用 default 设置默认值,故使用此办法
先插入一条数据
INSERT shendi VALUE('{}');
假设 json 结构如下
{
info : {
name : "名称"
}
}
现在需要设置 info.name,按照常规操作,应该是下面这样的
UPDATE shendi SET param=JSON_SET(param, '$.info.name', 'Shendi');
但这样设置后,查询,发现没有生效。示例图如下
问题解决
可以使用 CASE WHEN 的形式,当数据不存在时新增,存在修改,代码如下
UPDATE shendi SET param=CASE WHEN param->'$.info' IS NULL
THEN JSON_OBJECT('info', JSON_OBJECT('name', 'Shendi'))
ELSE JSON_SET(param, '$.info.name', 'Shendi')
END;
执行结果如下
补充(重要)
上面的这种形式,会直接替换param,如果param有其他信息将会丢失(JSON_OBJECT的原因)
可以直接使用 JSON_MERGE_PATCH 来替代上面的操作
JSON_MERGE_PATCH 返回一个由参数指定的多个 JSON 文档合并后的 JSON 文档,重复的,后面的参数替换前面的参数
UPDATE shendi SET param=JSON_MERGE_PATCH(param, JSON_OBJECT('info', JSON_OBJECT('name', 'Shendi')));
END
本文链接:https://sdpro.top/blog/html/article/1106.html♥ 赞助 ♥
尽管去做,或许最终的结果不尽人意,但你不付出,他不付出,那怎会进步呢?