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

MySQL 5.7 新增加的 JSON 特性对应的 json 方法

2017-04-20 18:21 435 查看
MySQL 函数分为四类,分别是创建(Create JSON Values)、修改(Modify JSON Values)、查询(Search JSON Values)以及返回json相关属性(Return JSON Value Attributes)的方法。


创建类的方法


JSON_ARRAY([val[, val] ...])

创建JSON数组形式的数据
SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());

[1, "abc", null, true, "11:30:24.000000"]


JSON_OBJECT([key, val[, key, val] ...])

创建一个JSON对象
SELECT JSON_OBJECT('id', 87, 'name', 'carrot');

{"id": 87, "name": "carrot"}


修改类的方法


JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)

在JSON数组后增加新的数据
mysql> SET @j = '["a", ["b", "c"], "d"]';

mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1);

["a", ["b", "c", 1], "d"]


JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)

插入数据到JSON中,path为插入的路径
mysql> SET @j = '["a", {"b": [1, 2]}, [3, 4]]';
mysql> SELECT JSON_ARRAY_INSERT(@j, '$[1]', 'x');

["a", "x", {"b": [1, 2]}, [3, 4]]


JSON_MERGE(json_doc, json_doc[, json_doc] ...)

合并JSON数据
SELECT JSON_MERGE('[1, 2]', '[true, false]');

[1, 2, true, false]


JSON_REMOVE(json_doc, path[, path] ...)

删除一部分JSON数据
mysql> SET @j = '["a", ["b", "c"], "d"]';
mysql> SELECT JSON_REMOVE(@j, '$[1]');

["a", "d"]


JSON_REPLACE(json_doc, path, val[, path, val] ...)

替换一部分JSON数据
mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
mysql> SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]');

{"a": 10, "b": [2, 3]}


JSON_SET(json_doc, path, val[, path, val] ...)

有存在的数据就替换,没有就插入
mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
mysql> SELECT JSON_SET(@j, '$.a', 10, '$.c', '[true, false]');

{"a": 10, "b": [2, 3], "c": "[true, false]"}


查询类方法


JSON_CONTAINS(json_doc, val[, path])

查找是否包含
mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
mysql> SET @j2 = '1';
mysql> SELECT JSON_CONTAINS(@j, @j2, '$.a');

1

mysql> SELECT JSON_CONTAINS(@j, @j2, '$.b');

0


JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)

查找path(一般就是key)是否存在
mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e');

1

mysql> SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e');

0


JSON_EXTRACT(json_doc, path[, path] ...)

分解JSON 并查询,实际上就是在提供的path下查找值
mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');

20

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

[20, 10]


JSON_EXTRACT 的替代语法 column->path

以下两种方式等价
mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g
> FROM jemp
> WHERE JSON_EXTRACT(c, "$.id") > 1
> ORDER BY JSON_EXTRACT(c, "$.name");

mysql> SELECT c, c->"$.id", g
> FROM jemp
> WHERE c->"$.id" > 1
> ORDER BY c->"$.name";


JSON_KEYS(json_doc[, path])

提出当前提供path下的key值
SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');

["a", "b"]


JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

按着提供的值去查询,返回path数组
mysql> SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';

mysql> SELECT JSON_SEARCH(@j, 'one', 'abc');

"$[0]"

mysql> SELECT JSON_SEARCH(@j, 'all', 'abc');

["$[0]", "$[2].x"]


查询JSON自有属性的方法


JSON_DEPTH(json_doc)

查询当前JSON深度
SELECT JSON_DEPTH('[10, {"a": 20}]');

3


JSON_LENGTH(json_doc[, path])

查询当前层级(path)下对象或者数组的元素数量
mysql> SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');

2


JSON_TYPE(json_val)

返回JSON值类型
mysql> SET @j = '{"a": [10, true]}';
mysql> SELECT JSON_TYPE(@j);

OBJECT

SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a'));

ARRAY


JSON_VALID(val)

验证是否是JSON
mysql> SELECT JSON_VALID('{"a": 1}');

1

SELECT JSON_VALID('hello'), JSON_VALID('"hello"');

0,1


以上是基本的方法。

注:以上内容参考自官方文档:https://dev.mysql.com/doc/refman/5.7/en/json-functions.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: