如何解决MySQL 8:除非手动输入子查询结果,否则使用 JSON_TABLE 的子查询不起作用
这是我面临的问题的最低工作版本。按照文档页面上的 the JSON table example,我在 MySQL 8 中有下表 test,其中 id 是一个 INT 字段,而 data 是一个 JSON 字段。
id | data
-----------------------------
1 | [{"x": 2,"y": "8"},{"x": "3","y": "7"},{"x": "4","y": 6}]
我可以使用这个语句成功获取数据(***):
SELECT data->"$[*]" as example FROM test t WHERE id = 1
在“example”列下返回:
[{"x": 2,"y" : 6}]
现在我想尝试从返回的数据构建一个 JSON_TABLE。如果我手动将数据输入到 JSON_TABLE 查询中,即
SELECT * FROM JSON_TABLE(
'[{"x": 2,"y": 6}]',"$[*]" COLUMNS (
rowID FOR ORDINALITY,xval VARCHAR(100) PATH "$.x",yval VARCHAR(100) PATH "$.y"
)
) AS tt
然后它根据文档正常工作。我得到了成功的结果:
rowID xval yval
1 2 8
2 3 7
3 4 6
但是,当我使用选择子查询时,即
SELECT * FROM JSON_TABLE(
SELECT data->"$[*]" FROM test t WHERE id = 1,yval VARCHAR(100) PATH "$.y"
)
) AS tt
然后我得到
1064 - 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以使用正确的语法 靠近 'SELECT data->"$[*]" FROM test t WHERE id = 1,"$[*]" COLUMNS ( 第 2 行的 rowID FOR OR'
我也尝试将子选择语句 (***) 包装到括号中,即
SELECT * FROM JSON_TABLE(
(SELECT data->"$[*]" FROM test t WHERE id = 1),yval VARCHAR(100) PATH "$.y"
)
) AS tt
但那给出了错误
1210 - JSON_TABLE 的参数不正确。
我认为这可能与 JSON 对象周围的引号有关?我也尝试过 JSON_QUOTE 和 JSON_UNQUOTE 但也没有运气。请帮忙。谢谢
解决方法
这样做的方法是:
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
documentation on JSON_TABLE() 仅显示使用 JSON 文字,这是一个不幸的疏忽。
原始 blog in which the MySQL Server team announced the JSON_TABLE() feature 显示了使用列引用代替 JSON 文字的示例。
我已向 MySQL 提交了向 JSON_TABLE() 文档添加示例的请求:https://bugs.mysql.com/bug.php?id=102089
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。