MySQL 8:使用 JSON_TABLE 的子查询无法工作,除非手动输入子查询结果

Cog*_*ero 2 mysql subquery mysql-json

这是我面临的问题的最低工作版本。按照文档页面上的JSON 表示例,我在 MySQL 8 中进行了下表测试,其中 id 是 INT 字段,data 是 JSON 字段。

id     |   data
-----------------------------
1      |   [{"x": 2, "y": "8"}, {"x": "3", "y": "7"}, {"x": "4", "y": 6}]
Run Code Online (Sandbox Code Playgroud)

我可以使用以下语句成功获取数据(***):

SELECT data->"$[*]" as example FROM test t WHERE id = 1
Run Code Online (Sandbox Code Playgroud)

它返回“示例”列下:

[{“x”:2,“y”:“8”},{“x”:“3”,“y”:“7”},{“x”:“4”,“y”:6} ]

现在我想尝试从返回的数据构造一个 JSON_TABLE 。如果我手动将数据输入到 JSON_TABLE 查询中,即

SELECT * FROM JSON_TABLE(
    '[{"x": 2, "y": "8"}, {"x": "3", "y": "7"}, {"x": "4", "y": 6}]',
    "$[*]" COLUMNS (
        rowID FOR ORDINALITY,
        xval VARCHAR(100) PATH "$.x",
        yval VARCHAR(100) PATH "$.y"
    )
) AS tt
Run Code Online (Sandbox Code Playgroud)

然后按照文档就可以正常工作了。我得到成功的结果:

rowID    xval    yval
  1        2       8
  2        3       7
  3        4       6
Run Code Online (Sandbox Code Playgroud)

但是,当我使用选择子查询时,即

SELECT * FROM JSON_TABLE(
    SELECT data->"$[*]" FROM test t WHERE id = 1,
    "$[*]" COLUMNS (
        rowID FOR ORDINALITY,
        xval VARCHAR(100) PATH "$.x",
        yval VARCHAR(100) PATH "$.y"
    )
) AS tt
Run Code Online (Sandbox Code Playgroud)

然后我得到

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 'SELECT data->"$[*]" FROM test t WHERE id = 1, "$[*]" COLUMNS ( rowID FOR OR' at line 附近使用的正确语法2

我还尝试将子选择语句(***)包装到括号中,即

SELECT * FROM JSON_TABLE(
    (SELECT data->"$[*]" FROM test t WHERE id = 1),
    "$[*]" COLUMNS (
        rowID FOR ORDINALITY,
        xval VARCHAR(100) PATH "$.x",
        yval VARCHAR(100) PATH "$.y"
    )
) AS tt
Run Code Online (Sandbox Code Playgroud)

但这给出了错误

1210 - JSON_TABLE 的参数不正确。

我认为这可能与 JSON 对象周围的引号有关?我也尝试过 JSON_QUOTE 和 JSON_UNQUOTE 但也没有运气。请帮忙。谢谢

Bil*_*win 7

这是这样做的方法:

SELECT tt.* FROM test
CROSS JOIN JSON_TABLE(
    test.data,
    '$[*]' COLUMNS (
        rowID FOR ORDINALITY,
        xval VARCHAR(100) PATH '$.x',
        yval VARCHAR(100) PATH '$.y'
    )
) AS tt
WHERE test.id = 1
Run Code Online (Sandbox Code Playgroud)

JSON_TABLE() 的文档仅显示使用 JSON 文字,这是一个不幸的疏忽。

MySQL Server 团队宣布 JSON_TABLE() 功能的原始博客显示了使用列引用代替 JSON 文字的示例。

我已经提交了 MySQL 向 JSON_TABLE() 文档添加示例的请求:https://bugs.mysql.com/bug.php?id =102089

更新:文档请求被关闭为“不是错误”,因为他们认为文档提供了足够的信息而没有代码示例。