目录以下是jsontable的语法使用示例NESTED PATH 嵌套路径横向派生表总结JSON_TABLE 是 MySQL 8.0 中一个新的 JSON 函数。它也是一个表函数,返回值不是标量值而是结果集。JSON_TABLE 将 JSON 文档(部分或全部)转换为关系表,以便您可以像使用普通表一样使用它。JSON_TABLE 函数从一个指定的 JSON 文档中提取数据并返回一个具有指定列的关系表。可以像普通的表一样使用 JSON_TABLE () 返回的表。json-table官方文档地址:https
想从JSON文档里直接提取表格数据来处理?MySQL 8.0引入的JSON_TABLE函数,正是为了解决这个痛点。它可不是返回简单的标量值,而是直接把JSON结构“翻译”成一个标准的结果集,让你能像操作普通表一样来查询JSON数据。
简单来说,JSON_TABLE的核心任务,就是从指定的JSON文档中提取信息,并根据你定义的列结构,返回一张关系型表格。这为复杂JSON数据的深度分析,打开了新的大门。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
官方文档永远是第一手资料,建议搭配阅读: https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html#function_json-table
JSON_TABLE(
expr,
path COLUMNS (column_list)
) [AS] alias
column_list:
column[, column][, ...]
column:
name FOR ORDINALITY
| name type PATH string path [on_empty] [on_error]
| name type EXISTS PATH string path
| NESTED [PATH] path COLUMNS (column_list)
on_empty:
{NULL | DEFAULT json_string | ERROR} ON EMPTY
on_error:
{NULL | DEFAULT json_string | ERROR} ON ERROR
语法看似复杂,但拆解开来,无非是定义数据源、提取路径和列映射这几个关键部分。
光说不练假把式,咱们用一个具体案例来上手。先创建一个包含ID和JSON类型名称字段的表:
CREATE TABLE t1(
id varchar(32),
name JSON
);
接着,插入几条测试数据:
INSERT INTO t1
VALUES (uuid_short(), json_array('John'));
INSERT INTO t1
VALUES (uuid_short(), json_array('toma','Smith'));
INSERT INTO t1
VALUES (uuid_short(), json_array('aa','bb','cc','tt'));
现在,我们的目标是把`t1`表中每条记录的`name`这个JSON数组打散,让每个数组元素和对应的`id`形成一行数据。这时,`JSON_TABLE`就派上用场了。这里用到的`$[*]`路径,表示提取JSON文档中的所有元素。
SELECT value,id
from t1
,
JSON_TABLE(name, '$[*]' COLUMNS (
value VARCHAR(255) PATH '$'
)) AS jt
执行一下,数据就成了下面这个样子,数组被完美地“扁平化”了:

简单的数组扁平化还不够?面对嵌套更深的JSON结构,比如数组里套对象,对象里又套数组,怎么办?别急,`NESTED PATH`就是为这种复杂场景而生的。它会为父路径中匹配到的每一项,再生成一组子记录。
咱们再加一条更复杂的数据来试试:
INSERT INTO t1
VALUES ('1', json_array(json_object('a',1,'b',json_array(11,111)),
json_object('a',2, 'b',json_array(22,222)),
json_object('a',3)));
现在,使用`NESTED PATH`来同时提取对象中的`a`字段和嵌套数组`b`中的每一个元素:
SELECT jt.*
FROM t1,
JSON_TABLE(
name,
'$[*]' COLUMNS (
a INT PATH '$.a',
NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$')
)
) AS jt
WHERE id = '1';
来看一下查询结果,你会发现,`b`数组中的每个值,都和其所属对象的`a`值正确关联了:

这里有个细节值得注意:经过`JSON_TABLE`转换后的所有列,都天然关联着原始行的ID。比如上面结果中`a`和`b`列的ID都是‘1’,而不会与其他行的ID混淆。这并非是MySQL的特殊处理,而是遵循了SQL的标准规范。
可以看下面这张图,关联关系一目了然:

说到SQL标准,就不得不提一下`JSON_TABLE`的连接行为。根据SQL标准,任何与表函数(如`JSON_TABLE()`)的连接,都被视为使用了`LATERAL`连接。这意味着,表函数的计算会依赖于它左侧表中的每一行。
实际上,在MySQL 8.0.14及之后的版本中,`LATERAL`关键字对于`JSON_TABLE()`是隐式存在的,甚至不允许显式写出。这也是为了严格符合SQL标准。所以,无论你在哪个兼容的MySQL版本中使用它,其横向连接的语义都是确定无疑的。
总结一下,`JSON_TABLE`函数是MySQL处理JSON数据的一把利器,尤其擅长将复杂、嵌套的JSON结构转换为规整的二维表格,极大地便利了后续的统计分析。从简单的数组展开到复杂的多层嵌套解析,结合`NESTED PATH`都能应对自如。理解其作为“横向派生表”的工作机制,有助于我们更准确地预测和编写关联查询。
希望以上的梳理和示例能为大家在实际工作中使用JSON_TABLE带来一些清晰的思路。如果遇到更复杂的场景,多动手试验,结合官方文档,往往就能找到解决方案。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述