Mysql字段类型JSON,嵌套JSON为空设置嵌套JSON的值

专栏收录该内容

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

♥ 赞助 ♥

尽管去做,或许最终的结果不尽人意,但你不付出,他不付出,那怎会进步呢?