MySQL 5.7 JSON操作

JSON是一种轻量级的数据交换格式,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输,在现在开发中非常流行。 MySQL 5.7 自 2015年12月发布已经过去5年多了,现在回头补学还来得及吧。

中文手册:https://www.docs4dev.com/docs/zh/mysql/5.7/reference/json.html
1、JSON长什么样?
(1)JSON 数组包含用逗号分隔并包含在[和]字符内的值的列 table:

["abc", 10, null, true, false]

(2)JSON 对象包含一组键值对,以逗号分隔并包含在{和}字符内:

{"k1": "value", "k2": 10}

(3)如示例所示,JSON 数组和对象可以包含字符串或数字的标量值,JSON 空 Literals 或 JSON 布尔值 true 或 falseLiterals。 JSON 对象中的键必须是字符串。还允许使用时间(日期,时间或日期时间)标量值:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]

(4)JSON 数组元素和 JSON 对象键值中允许嵌套:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}

JSON_TYPE()函数需要一个 JSON 参数,并尝试将其解析为 JSON 值。如果有效,则返回值的 JSON 类型,否则返回错误

2、JSON 值的规范化,合并和自动包装
JSON_OBJECT()具有与文档中较早发现的键重复的键的成员将被丢弃(即使值不同);

mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def');

结果:{“key1”: 1, “key2”: “abc”}
JSON_MERGE()通过将稍后命名的数组连接到第一个数组的末尾,将数组合并为单个数组。

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

结果: [1, 2, “a”, “b”, true, false]

3、搜索和修改 JSON 值
JSON_EXTRACT:路径 table 达式对于提取 JSON 文档的一部分或修改 JSON 文档以指定在该文档中的何处进行操作的函数很有用

SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');

结果: “Aztalan”
补充使用:路径可以包含或**通配符:
.[
]求值为 JSON 对象中所有成员的值。
[*]计算 JSON 数组中所有元素的值。
prefix**suffix计算所有以命名前缀开头并以命名后缀结尾的路径。
文档中不存在的路径(评估为不存在的数据)评估为NULL。

JSON_SET()替换现有路径的值,并添加不存在的路径的值

SET @j = '["a", {"b": [true, false]}, [10, 20]]';
SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);

结果:[“a”, {“b”: [1, false]}, [10, 20, 2]]

JSON_INSERT()添加新值,但不替换现有值

SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2)

结果:[“a”, {“b”: [true, false]}, [10, 20, 2]]

JSON_REPLACE()替换现有值,并忽略新值

SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);

结果:[“a”, {“b”: [1, false]}, [10, 20]]

JSON_REMOVE()接收 JSON 文档和一个或多个指定要从该文档中删除的值的路径

 SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');

结果: [“a”, {“b”: [true]}]

4、JSON 值的比较和排序
可以使用=,<,<=,>,>=,<>,!=和<=>运算符比较 JSON 值;
规则:对于具有相同优先级的 JSON 值,比较规则是特定于类型的:

BLOB
比较两个值的第一个* N 字节,其中 N 是较短值中的字节数。如果两个值的前 N *字节相同,则较短的值将在较长的值之前排序。

BIT
与BLOB相同的规则。

OPAQUE
与BLOB相同的规则。 OPAQUE值是未归类为其他类型之一的值。

DATETIME
table 示较早时间点的值先于 table 示较晚时间点的值排序。如果两个值最初分别来自 MySQL DATETIME和TIMESTAMP类型,则如果它们 table 示相同的时间点,则它们相等。

TIME
两个时间值中较小的一个先于较大的一个。

DATE
较早的日期在较新的日期之前排序。

ARRAY
如果两个 JSON 数组的长度相同并且数组中对应位置的值相等,则它们相等。

如果数组不相等,则它们的 Sequences 由存在差异的第一个位置的元素确定。在该位置具有较小值的数组将首先排序。如果较短数组的所有值都等于较长数组中的相应值,则首先对较短数组进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值