查看: 94|回覆: 0

mysql的jsonTable使用及说明

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2008-10-12
發表於 2026-1-4 15:36:22 | 顯示全部樓層 |閲讀模式

JSON_TABLE 是 MySQL 8.0 中一个新的 JSON 函数。它也是一个表函数,返回值不是标量值而是结果集。

JSON_TABLE 将 JSON 文档(部分或全部)转换为关系表,以便您可以像使用普通表一样使用它。

JSON_TABLE 函数从一个指定的 JSON 文档中提取数据并返回一个具有指定列的关系表。可以像普通的表一样使用 JSON_TABLE () 返回的表。

json-table官方文档地址:

https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

以下是jsontable的语法

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和名称:

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 表中查询所有名称和id,进行查询(在 MySQL 中,JSON_TABLE 函数的 JSON 路径表达式可以使用 $ 符号来指定。

$

  • 表示提取 JSON 文档中的所有属性):

    SELECT value,id
    from t1
            ,
         JSON_TABLE(name, '$
  • ' COLUMNS ( value VARCHAR(255) PATH '$' )) AS jt
  • 数据将如下:

    NESTED PATH 嵌套路径

    NESTED PATH为其所属的子句中的每个匹配项生成一组记录。可以解决复杂的json嵌套数据转为行。

    添加一条数据:

    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:

    SELECT jt.*
    FROM t1,
         JSON_TABLE(
                 name,
                 '$
  • ' COLUMNS ( a INT PATH '$.a', NESTED PATH '$.b
  • ' COLUMNS (b INT PATH '$') ) ) AS jt WHERE id = '1';
  • 我们发现每次jsontable后依然会对应所在的ID,比如:

    上面需求的a,b列的ID就是1而不是其他ID。这其实是遵从了sql标准。

    横向派生表

    根据SQL标准,MySQL总是将带有表函数(如JSON_TABLE())的连接视为使用LATERAL无论MySQL发布版本如何,都是如此,这就是为什么即使在8.0.14之前的MySQL版本中也可以加入此函数的原因。

    在MySQL 8.0.14及更高版本中,LATERAL 关键字是隐式的,不允许在 JSON_TABLE() 之前使用。这也是根据SQL标准。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。

  • 回覆

    使用道具 舉報

    您需要登錄後才可以回帖 登錄 | 立即注册

    本版積分規則

    相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

    Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

    在本版发帖返回顶部