参数说明
| 参数 | 说明 |
|---|---|
| json_doc | 有效的 JSON 文档 |
| path | 成员路径 |
MySQL 5.7.8+ 支持原生 JSON 类型。除了不同的创建 JSON 对象的方法外,你还可以通过多种方式访问和读取成员。
主要函数是 JSON_EXTRACT,而 -> 和 ->> 运算符则更加友好。
第 35.1 节:读取 JSON 数组值
创建一个 @myjson 变量作为 JSON 类型:
SET @myjson = CAST('["A","B",{"id":1,"label":"C"}]' AS JSON);
读取某些成员:
SELECT
JSON_EXTRACT(@myjson, '$[1]'),
JSON_EXTRACT(@myjson, '$[*].label'),
JSON_EXTRACT(@myjson, '$[1].*'),
JSON_EXTRACT(@myjson, '$[2].*');
结果值:"B"、["C"]、NULL、[1, "C"]。
第 35.2 节:JSON 提取运算符
使用 -> 或 ->> 运算符提取路径,其中 ->> 返回不带引号的值:
SELECT
myjson_col->'$[1]',
myjson_col->>'$[1]',
myjson_col->'$[*].label',
myjson_col->'$[1].*',
myjson_col->'$[2].*'
FROM tablename;
结果:B、"B"、["C"]、NULL、[1, "C"]。
因此,col->path 等同于 JSON_UNQUOTE(JSON_EXTRACT(col, path))。
与 -> 一样,->> 运算符总是在 EXPLAIN 的输出中展开,如下例所示:
mysql> EXPLAIN SELECT c->>'$.name' AS name FROM jemp WHERE g > 2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: jemp
partitions: NULL
type: range
possible_keys: i
key: i
key_len: 5
ref: NULL
rows: 2
filtered: 100.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from `jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)
1 row in set (0.00 sec)