数据库表和数据
CREATE TABLE `t_json` (
`id` int NOT NULL AUTO_INCREMENT,
`json_val` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9;
INSERT INTO t_json (json_val) VALUES
('[3,4,5,6,7]')
,('[5,6,7,8,9]')
,('["3","4","5","6","7"]')
,('["5","6","7","8","9"]');
JSON_SEARCH
SELECT
*,
JSON_SEARCH(json_val, 'one', '6') AS search_int,
JSON_SEARCH(json_val, 'one', '"6"') AS search_str
FROM t_json;
总结:
JSON_SEARCH(json_val, 'one', '6') 查找json数组中,字符串型"6"的下标索引;
JSON_SEARCH(json_val, 'one', '"6"') 无用;
JSON_SEARCH只能检索字符型下标。
JSON_CONTAINS
SELECT
*,
JSON_CONTAINS(json_val, '6') AS contains_int,
JSON_CONTAINS(json_val, '"6"') AS contains_str
FROM t_json;
总结:
JSON_CONTAINS(json_val, '6') 判断json数组中,是否包含数值型6,返回1为包含,0为不包含;
JSON_CONTAINS(json_val, 'one', '"6"') 判断json数组中,是否包含字符串型"6",返回1为包含,0为不包含。
JSON_UNQUOTE
SELECT JSON_UNQUOTE("$[3]")
总结:
JSON_UNQUOTE("$[3]") 去除""
JSON_ARRAY_INSERT
需求:若json数组中不包含字符串型"5",则在数组头部插入"5"
1.sql语句写法
UPDATE t_json
SET json_val=JSON_ARRAY_INSERT(json_val, '$[0]', '5')
WHERE JSON_CONTAINS(json_val,'"5"') = 0;
2.mapper.xml写法
UPDATE t_json
SET json_val=JSON_ARRAY_INSERT(json_val, '$[0]', #{technicianId,jdbcType=VARCHAR})
WHERE JSON_CONTAINS(json_val,CONCAT('"',#{technicianId,jdbcType=VARCHAR},'"')) = 0;
执行前
执行后
JSON_REMOVE
需求:若json数组中包含字符串型"5",则删除数组中的"5"
1.sql语句写法
UPDATE t_json
SET json_val=JSON_REMOVE(json_val,JSON_UNQUOTE(JSON_SEARCH(json_val, 'one', '5')))
WHERE JSON_CONTAINS(json_val,'"5"') = 1;
2.mapper.xml写法
UPDATE t_json
SET json_val=JSON_REMOVE(json_val,JSON_UNQUOTE(JSON_SEARCH(json_val, 'one', #{technicianId,jdbcType=VARCHAR})))
WHERE JSON_CONTAINS(json_val,CONCAT('"',#{technicianId,jdbcType=VARCHAR},'"')) = 1;
执行前
执行后