MySQL 数据库中的->>运算符是用于提取 JSON 文档中指定路径的值的运算符。它允许从 JSON 数据中方便地访问和操作嵌套的属性。和->操作符功能一样并且多了一个去除引号的功能,相当于JSON_UNQUOTE()函数嵌套JSON_EXTRACT()函数。
语法如下:
document ->> path
其中,`document`是要查询的 JSON 文档,可以是一个列或表达式,`path`是一个字符串,表示要访问的 JSON 字段的路径。
这是详细信息得内容。
-- ---------------------------- -- Table structure for students -- ---------------------------- DROP TABLE IF EXISTS `students`; CREATE TABLE `students` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `course` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of students -- ---------------------------- INSERT INTO `students` VALUES ('1', 'Odin', '{\"coursejson\": [{\"name\": \"语文\", \"score\": 81},{\"name\": \"数学\", \"score\": 74},{\"name\": \"英语\", \"score\": 95}]}'); INSERT INTO `students` VALUES ('2', '小胡', '{\"coursejson\": [{\"name\": \"语文\", \"score\": 31},{\"name\": \"数学\", \"score\": 64},{\"name\": \"英语\", \"score\": 55}]}'); INSERT INTO `students` VALUES ('3', 'Jack', '{\"coursejson\": [{\"name\": \"语文\", \"score\": 66},{\"name\": \"数学\", \"score\": 84},{\"name\": \"英语\", \"score\": 89}]}');
原始数据
mysql> select * from students; +----+--------+-------------------------------------------------------------------------------------------------------------------+ | id | name | course | +----+--------+-------------------------------------------------------------------------------------------------------------------+ | 1 | Odin | {"coursejson": [{"name": "语文", "score": 81},{"name": "数学", "score": 74},{"name": "英语", "score": 95}]} | | 2 | 小胡 | {"coursejson": [{"name": "语文", "score": 31},{"name": "数学", "score": 64},{"name": "英语", "score": 55}]} | | 3 | Jack | {"coursejson": [{"name": "语文", "score": 66},{"name": "数学", "score": 84},{"name": "英语", "score": 89}]} | +----+--------+-------------------------------------------------------------------------------------------------------------------+
先正常获取json数据的name值
mysql> SELECT id,name,course->'$.coursejson[0].name' from students; +----+--------+--------------------------------+ | id | name | course->'$.coursejson[0].name' | +----+--------+--------------------------------+ | 1 | Odin | "语文" | | 2 | 小胡 | "语文" | | 3 | Jack | "语文" | +----+--------+--------------------------------+
去除引号
mysql> SELECT id,name,course->>'$.coursejson[0].name' from students; +----+--------+---------------------------------+ | id | name | course->>'$.coursejson[0].name' | +----+--------+---------------------------------+ | 1 | Odin | 语文 | | 2 | 小胡 | 语文 | | 3 | Jack | 语文 | +----+--------+---------------------------------+
1. 路径表达式的格式
在使用->>时,路径表达式的格式非常重要。它应该遵循 JSON 路径表达式的规范,以点号(.)分隔字段名,并使用方括号([])表示数组元素的索引。例如,`$.name` 表示根节点下的名为 `name` 的字段,`$.person.name` 表示根节点下的名为 `person` 的字段中的名为 `name` 的字段。
2. 数据类型转换
->>返回的值的数据类型取决于提取路径对应的值的数据类型。如果提取路径对应的值是字符串,那么返回值将是字符串类型。如果提取路径对应的值是数字,那么返回值将是数字类型。如果提取路径对应的值是布尔值,那么返回值将是布尔类型。如果提取路径对应的值是数组或对象,那么返回值将是 JSON 数组或 JSON 对象。
3. 错误处理
如果->>在执行时遇到错误,例如路径表达式无效或 JSON 文档格式错误,它将返回 NULL 而不是抛出异常。因此,在使用->>时,应该注意检查返回值是否为 NULL,以避免潜在的错误。
4. 性能考虑
在处理大型 JSON 文档时,使用->>可能会导致性能问题。为了提高性能,可以考虑使用索引或优化查询语句。
->>在 MySQL 数据库中非常有用,它可以帮助我们从 JSON 数据中提取需要的信息。在使用 ->>时,需要注意路径表达式的格式、数据类型转换、错误处理和性能考虑等问题。通过合理使用->>,可以方便地处理和分析 JSON 数据,提高数据处理和分析的效率。