参数说明

参数 说明
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)