您的位置:首页 > 数据库 > MySQL

mysql json

2019-11-05 18:05 1761 查看


SELECT VERSION();


-- 一、JSON 函数创建
SELECT JSON_ARRAY('id',id,'name',`name`) FROM sys_role LIMIT 3;

SELECT JSON_OBJECT('id',id,'name',`name`) FROM sys_role LIMIT 3;

-- 用双引号引起来并转义内部引号和其他字符来将utf8mb4字符串引为JSON值
SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"');


-- 提供了两个生成JSON值的聚合函数(MySQL 5.7.22和更高版本)

 

/*
将结果集聚合为单个 JSON数组,其元素由行组成。此数组中元素的顺序未定义。该函数作用于计算为单个值的列或表达式。返回 NULL如果结果不包含任何行,或在错误的事件。
*/
select create_by,JSON_ARRAYAGG(`name`) from sys_role GROUP BY create_by
SELECT JSON_OBJECTAGG (id ,`name` ) from sys_role GROUP BY create_by

 

-- 二、JSON 函数查询
/*
通过返回1或0指示给定的candidateJSON文档是否包含在targetJSON文档中
语法:JSON_CONTAINS(target, candidate[, path])
0 不存在 1 存在
*/
SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
SET @j2 = '1';
SELECT JSON_CONTAINS(@j, @j2, '$.a');
SELECT JSON_CONTAINS(@j, @j2, '$.b');


SET @j2 = '{"d": 4}';
SELECT JSON_CONTAINS(@j, @j2, '$.a');

SELECT JSON_CONTAINS(@j, @j2, '$.c');

 

/*
返回0或1以指示JSON 20c4 文档是否包含给定路径中的数据
语法:JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
'one':如果文档中至少存在一个路径,则为1,否则为0。

'all':如果文档中存在所有路径,则为1,否则为0。

任何path 参数不是有效的路径表达式,或者 one_or_all不是 'one'或,都会发生错误'all'。
*/

SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e');
SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e');

SELECT JSON_CONTAINS_PATH(@j, 'one', '$.c.d');

SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a.d');

 

/*
从JSON文档中返回数据,该数据是从与path 参数匹配的文档部分中选择的
JSON_EXTRACT(json_doc, path[, path] ...)
*/

SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');

SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]');
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');

 

/*
column->path
与两个参数一起使用时,该 -> 运算符充当JSON_EXTRACT()函数的别名 ,两个参数分别是左侧的列标识符和右侧的JSON路径
*/
SELECT name,JSON_EXTRACT(name,'$.records')as records,JSON_EXTRACT(name,'$.size')as size,id FROM tbl_json

-- 此功能不限于 SELECT,如下所示:
SELECT name,JSON_EXTRACT(name,'$.records')as records,JSON_EXTRACT(name,'$.size')as size FROM tbl_json where JSON_EXTRACT(name,'$.size')>10


/*
JSON_KEYS(json_doc[, path])
从JSON对象的顶级值作为JSON数组返回键,或者,如果path 给定了参数,则从所选路径返回顶级键。NULL如果任何参数是 NULL,则返回,该 json_doc参数不是对象,或者path如果给定,则不定位对象。如果json_doc参数不是有效的JSON文档,或者path参数不是有效的路径表达式或包含 *或**通配符,则会发生错误 。
SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');

 

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
返回JSON文档中给定字符串的路径。NULL如果任何一个,或 参数为 json_doc, 则 返回; 文件中不存在;或 找不到。发生错误时,如果参数不是一个有效的JSON文档,任何 参数不是一个有效的路径表达式, 是不 或,或者 是不是一个常量表达式。 search_strpathNULLpathsearch_strjson_docpathone_or_all'one''all'escape_char
该one_or_all参数影响搜索,
'one':搜索在第一个匹配项后终止,并返回一个路径字符串。未定义首先考虑哪个匹配。
'all':搜索将返回所有匹配的路径字符串,因此不包括重复的路径。如果有多个字符串,它们将自动包装为一个数组。数组元素的顺序是不确定的。

SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
SELECT JSON_SEARCH(@j, 'one', 'abc');

SELECT JSON_SEARCH(@j, 'all', 'abc');
SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[1]');
SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[3]');
*/

 

 

 

-- 三 修改
/*
1.JSON_APPEND(json_doc, path, val[, path, val] ...)
加到JSON文档中指定数组的末尾并返回结果 在MySQL 5.7.9中已重命名;别名JSON_APPEND()现在在MySQL 5.7中已弃用,在MySQL 8.0中已删除。
测试:


2.JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
将值附加到JSON文档中指定数组的末尾并返回结果。

测试:
SET @j = '["a", ["b", "c"], "d"]';
SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1);
SELECT JSON_ARRAY_APPEND(@j, '$[0]', 2);
SELECT JSON_ARRAY_APPEND(@j, '$[1][0]', 3);

SET @j = '{"a": 1, "b": [2, 3], "c": 4}';
SELECT JSON_ARRAY_APPEND(@j, '$.b', 'x');
SELECT JSON_ARRAY_APPEND(@j, '$.c', 'y');


SET @j = '{"a": 1}';
SELECT JSON_ARRAY_APPEND(@j, '$', 'z');

 


3.JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
更新JSON文档,将其插入文档中的数组中并返回修改后的文档

SET @j = '["a", {"b": [1, 2]}, [3, 4]]';
SELECT JSON_ARRAY_INSERT(@j, '$[1]', 'x');
如果路径标识数组元素,则将相应的值插入该元素位置,然后将所有后续值向右移动。如果路径标识了超出数组末尾的数组位置,则将值插入到数组末尾。
SELECT JSON_ARRAY_INSERT(@j, '$[101]', 'x');
SELECT JSON_ARRAY_INSERT(@j, '$[1].b[0]', 'x');
SELECT JSON_ARRAY_INSERT(@j, '$[2][1]', 'y');
SELECT JSON_ARRAY_INSERT(@j, '$[0]', 'x', '$[2][1]', 'y');
*/

/*

4.JSON_INSERT(json_doc, path, val[, path, val] ...)
将数据插入JSON文档并返回结果。返回NULL是否有任何参数 NULL。如果json_doc参数不是有效的JSON文档或任何path参数不是有效的路径表达式或包含 *或**通配符,则会发生错误 。
SET @j = '{ "a": 1, "b": [2, 3]}';
SELECT JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]');
*/

 

/*
5.JSON_MERGE(json_doc, json_doc[, json_doc] ...)
合并两个或多个JSON文档。同义词 JSON_MERGE_PRESERVE(); 在MySQL 5.7.22中已弃用,并可能在将来的版本中删除。

SELECT JSON_MERGE('[1, 2]', '[true, false]');


JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
对两个或多个JSON文档 执行 符合RFC 7396的合并,并返回合并的结果,而不会保留具有重复密钥的成员。如果至少有一个作为此函数的参数传递的文档无效,则会引发错误。

JSON_MERGE_PATCH() 执行如下合并:
①如果第一个参数不是对象,则合并的结果与将空对象与第二个参数合并的结果相同。
SELECT JSON_MERGE_PATCH('[1, 2]', '[true, false]');
SELECT JSON_MERGE_PATCH('[1, 2]', '{"id": 47}');
SELECT JSON_MERGE_PATCH('1', 'true');
②如果第二个参数不是对象,则合并的结果为第二个参数。
SELECT JSON_MERGE_PATCH('{"name": "x"}', 'true');
③如果两个参数都是对象,则合并的结果是具有以下成员的对象:
第一个对象的所有成员在第二个对象中不具有具有相同键的对应成员。
第二个对象的所有成员,在第一个对象中没有对应的键,并且其值不是JSON null文字。
SELECT JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}');

具有第一个和第二个对象中都存在且其第二个对象中的值不是JSON null 文字的键的所有成员。这些成员的值是将第一个对象中的值与第二个对象中的值递归合并的结果。
SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }', '{ "a": 3, "c":4 }');
SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }', '{ "a": 5, "d":6 }');
SELECT JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}');
④JSON_MERGE_PATCH()与JSON_MERGE_PRESERVE()的比较。 的行为与的行为JSON_MERGE_PATCH()相同 JSON_MERGE_PRESERVE(),但以下两个例外:
JSON_MERGE_PATCH()删除与第二个对象中的键匹配的第一个对象中的任何成员,前提是与第二个对象中的键关联的值不是JSON null。
如果第二个对象的成员具有与第一个对象中的成员匹配的键,请 JSON_MERGE_PATCH() 用第二个对象中的值替换第一个对象中的值,而 JSON_MERGE_PRESERVE() 将第二个值附加到第一个值中

SET @x = '{ "a": 1, "b": 2 }',
@y = '{ "a": 3, "c": 4 }',
@z = '{ "a": 5, "d": 6 }';
SELECT JSON_MERGE_PATCH(@x, @y, @z) AS Patch,JSON_MERGE_PRESERVE(@x, @y, @z) AS Preserve;

结果:
+----------------------------------+------------------------------------------+
| Patch | Preserve |
+----------------------------------+------------------------------------------+
| {"a": 5, "b": 2, "c": 4, "d": 6} | {"a": [1, 3, 5], "b": 2, "c": 4, "d": 6} |
+----------------------------------+------------------------------------------+
1 row in set (0.00 sec)
*/

/**
6.JSON_REMOVE(json_doc, path[, p aec ath] ...)
从JSON文档中删除数据并返回结果
SET @j = '["a", ["b", "c"], "d"]';
SELECT JSON_REMOVE(@j, '$[1]');
*/

/*
7.
JSON_SET(), JSON_INSERT()和 JSON_REPLACE()功能的关系:
JSON_SET() 替换现有值并添加不存在的值。
JSON_INSERT() 插入值而不替换现有值。
JSON_REPLACE()仅替换 现有值。
*/
SET @j = '{ "a": 1, "b": [2, 3]}';
SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]');
-- 测试
UPDATE tbl_json set name= JSON_SET(`name`,'$.addColomn',50 ) where id=1;
UPDATE tbl_json set name= JSON_replace(`name`,'$.records','modifiedname2' ) where id=1;
UPDATE tbl_json set name= JSON_insert(`name`,'$.records','modifiedname2' ) where id=1;
UPDATE tbl_json set name= JSON_REPLACE(`name`,'$.records[*]','modifiedname2' ) where id=2;

 

/**
8.JSON_UNQUOTE(json_val)
取消引用JSON值
SET @j = '"abc"';
SELECT @j, JSON_UNQUOTE(@j);

SET @j = '[1, 2, 3]';
SELECT @j, JSON_UNQUOTE(@j);
*/

 

 

 

/*******************/
/*******************/
/*******************/
/* sql 测试数据 **/
/*******************/
/*******************/
/*******************/

SET FOREIGN_KEY_CHECKS=0;


DROP TABLE IF EXISTS `tbl_json`;
CREATE TABLE `tbl_json` (
`name` json NOT NULL,
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tbl_json
-- ----------------------------
INSERT INTO `tbl_json` VALUES ('{\"size\": 10, \"pages\": 1, \"total\": 3, \"current\": 1, \"records\": [{\"id\": \"1186882463536865281\", \"name\": \"modifiedname\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666611\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571809805000, \"updateDate\": 1572243511000}, {\"id\": \"1187245333613207553\", \"name\": \"Test2\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"6666\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571896320000, \"updateDate\": 1572243288000}, {\"id\": \"1188636316976394242\", \"name\": \"666666\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666666\", \"createBy\": \"1185073393381216257\", \"createDate\": 1572227956000}], \"addColomn\": 40, \"searchCount\": true}', '1');
INSERT INTO `tbl_json` VALUES ('{\"size\": 20, \"pages\": 1, \"total\": 3, \"current\": 1, \"records\": [{\"id\": \"1186882463536865281\", \"name\": \"Test1\", \"siteId\": \"1184375594306048002\", 105a \"delFlag\": \"0\", \"remarks\": \"666611\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571809805000, \"updateDate\": 1572243511000}, {\"id\": \"1187245333613207553\", \"name\": \"Test2\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"6666\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571896320000, \"updateDate\": 1572243288000}, {\"id\": \"1188636316976394242\", \"name\": \"666666\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666666\", \"createBy\": \"1185073393381216257\", \"createDate\": 1572227956000}], \"searchCount\": true}', '2');
INSERT INTO `tbl_json` VALUES ('{\"size\": 30, \"pages\": 1, \"total\": 3, \"current\": 1, \"records\": [{\"id\": \"1186882463536865281\", \"name\": \"Test1\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666611\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571809805000, \"updateDate\": 1572243511000}, {\"id\": \"1187245333613207553\", \"name\": \"Test2\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"6666\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571896320000, \"updateDate\": 1572243288000}, {\"id\": \"1188636316976394242\", \"name\": \"666666\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666666\", \"createBy\": \"1185073393381216257\", \"createDate\": 1572227956000}], \"searchCount\": true}', '3');
INSERT INTO `tbl_json` VALUES ('{\"size\": 40, \"pages\": 1, \"total\": 3, \"current\": 1, \"records\": [{\"id\": \"281\", \"name\": \"Test1\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666611\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571809805000, \"updateDate\": 1572243511000}, {\"id\": \"1187245333613207553\", \"name\": \"Test2\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"6666\", \"createBy\": \"1185073393381216257\", \"updateBy\": \"1185073393381216257\", \"createDate\": 1571896320000, \"updateDate\": 1572243288000}, {\"id\": \"1188636316976394242\", \"name\": \"666666\", \"siteId\": \"1184375594306048002\", \"delFlag\": \"0\", \"remarks\": \"666666\", \"createBy\": \"1185073393381216257\", \"createDate\": 1572227956000}], \"searchCount\": true}', '4');

 


SET FOREIGN_KEY_CHECKS=0;


DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`id` varchar(64) NOT NULL COMMENT '编号',
`name` varchar(100) NOT NULL COMMENT '角色名称',
`code` varchar(255) DEFAULT NULL COMMENT '英文名称',
`is_sys` varchar(64) DEFAULT NULL COMMENT '是否系统数据',
`usable` varchar(64) DEFAULT NULL COMMENT '是否可用',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`remarks` varchar(255) DEFAULT NULL COMMENT '备注信息',
`del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `sys_role_del_flag` (`del_flag`),
KEY `sys_role_enname` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';

-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES ('00970c91add6ba46d86c75e1ab91d391', 'T', '1', '1', '1', '1185073393381216257', '2019-10-24 13:45:06', null, '2019-10-24 13:46:14', null, '1');
INSERT INTO `sys_role` VALUES ('1', '1', '1', '1', '1', '100000', '2019-11-04 09:14:34', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('14333af1a524106b90399f786a1cacb3', 'Test1', '1', '1', '1', '1185073393381216257', '2019-10-24 10:58:23', null, '2019-10-24 10:59:12', null, '1');
INSERT INTO `sys_role` VALUES ('2', '单个资源测试' 1eae , '111', '1', '1', '100000', '2019-11-01 17:38:26', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('22d727a5f5bdfcc415af8721148bc2dc', '测试', 'testRole', '1', '1', '100000', '2019-10-22 14:07:53', '100000', '2019-10-30 09:11:32', null, '0');
INSERT INTO `sys_role` VALUES ('3', 'Test01', 'T', '1', '1', '100000', '2019-11-01 09:57:46', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('402880e45b5d7636015b5d8baca60000', '普通用户', 'normal', '1', '1', '100000', '2017-04-11 23:04:46', '4028ea815a3d2a8c015a3d2f8d2a0002', '2019-10-29 16:06:45', '', '0');
INSERT INTO `sys_role` VALUES ('40288ab85a362150015a3675ca950006', '系统管理员', 'admin', '1', '1', '100000', '2017-02-13 15:52:53', '4028ea815a3d2a8c015a3d2f8d2a0002', '2019-10-29 16:06:41', '系统管理员', '0');
INSERT INTO `sys_role` VALUES ('60603bc8e164402db5d0bcd631c65ec6', '物业管理', 'Property', '1', '1', '4028ea815a3d2a8c015a3d2f8d2a0002', '2019-05-11 10:54:21', null, '2018-10-31 21:32:40', '物业人员角色', '0');
INSERT INTO `sys_role` VALUES ('61e430b7951bb2330c365286e44834f9', '123', 'Test', '1', '1', '100000', '2019-10-21 09:39:05', null, '2018-10-31 21:32:40', '123', '1');
INSERT INTO `sys_role` VALUES ('628fe06896db09429d40e87e80596e2e', 'Test2', 'Test2', '1', '1', '1185073393381216257', '2019-10-21 13:44:12', null, '2018-10-31 21:32:40', 'Test2', '1');
INSERT INTO `sys_role` VALUES ('6ed09514cb3aaca370de291b403b4646', '1', '1', '1', '1', '100000', '2019-11-04 09:14:34', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('7ab99a7e30f4049d5cbf425034e6ba9e', 'Test01', 'T', '1', '1', '100000', '2019-11-01 09:57:46', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('7f821abac4391541b6c9c44406c3c1e1', '管理流程角色', '123', '1', '1', '1185073393381216257', '2019-10-29 15:26:15', '100000', '2019-10-30 09:14:13', null, '0');
INSERT INTO `sys_role` VALUES ('8336d428c0a9fa7f2bc7a32732895654', 'Test1', 'Test', '1', '1', '1185073393381216257', '2019-10-21 13:40:24', null, '2018-10-31 21:32:40', 'Test', '1');
INSERT INTO `sys_role` VALUES ('8c6cb9c0d1d0d7c8e50e6bba2545c4e5', '1111', '1111', '1', '1', '1174596993469739009', '2019-10-31 16:40:25', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('97c55c2f109054ea3b4aa7c0d326e9ec', '单个资源测试', '111', '1', '1', '100000', '2019-11-01 17:38:26', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('9f3fffc0677c661aa5a671e4767c0c10', '建筑公司角色', '11101', '0', '1', '100000', '2019-10-24 17:25:45', null, null, null, '0');
INSERT INTO `sys_role` VALUES ('c50e534e5ba510c6cf9a7f0ded5a2649', '工地管理', 'site', '1', '1', '1174596993469739009', '2019-10-09 11:22:23', '100000', '2019-10-30 09:13:06', null, '0');
INSERT INTO `sys_role` VALUES ('cdfa1462a6cae11dab68b9fa37c663f4', '满意度', 'foreign', '1', '1', '100000', '2019-09-24 09:30:14', '1185073393381216257', '2018-10-31 21:32:40', null, '0');
INSERT INTO `sys_role` VALUES ('d990019c8b9a103482784fe7d936a276', 'Test', '1', '1', '1', '1185073393381216257', '2019-10-24 10:48:07', null, '2019-10-24 10:51:36', null, '1');
INSERT INTO `sys_role` VALUES ('e574e76d1bb2badcbce3ad7a6940d4ae', '22', '34', '1', '1', '1174596993469739009', '2019-10-28 10:43:39', null, '2019-10-28 10:43:57', null, '1');
INSERT INTO `sys_role` VALUES ('e681fcc3a5aecfc55947efccf0b15973', 'Test1', 'Test1', '1', '1', '1185073393381216257', '2019-10-21 13:46:06', null, '2018-10-31 21:32:40', 'Test1', '1');
INSERT INTO `sys_role` VALUES ('e688f3097ac887ab4f7fbe13acaba63a', 'Test1', 'Test1', '1', '1', '1185073393381216257', '2019-10-21 13:42:52', null, '2018-10-31 21:32:40', 'Test1', '1');

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: