如何解决在兼容 MySQL 5.7 的 Amazon Aurora 中调用 JSON_TABLE() 时出错
尝试在兼容 MySQL 5.7 的 Amazon Aurora 中使用 JSON_TABLE()
函数时出现以下错误。
错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在 '(@json_col,'$.people[*]' COLUMNS ( name VARCHAR(40) PATH '$.na' at line 1
) 附近使用的正确语法在Amzon Mysql JSON Documentation中声明它支持很多JSON函数。但是 JSON_TABLE
并未列在其中。
我可以在 Mysql 8(不是 AWS Aurora)中执行以下查询,它给了我以下结果。
SET @json_col = '{
"people": [
{
"name": "John Smith"
},{
"name": "Sally Brown"
},{
"name": "John Johnson"
}
]
}';
SELECT * from JSON_TABLE(@json_col,'$.people[*]' COLUMNS (
name VARCHAR(40) PATH '$.name')
) people;
是否可以在 MySQL Aurora 5.7 中使用任何替代方法来实现上述结果。我尝试替换 JSON_EXTRACT
。但是,它导致显示与上述相同的错误。
解决方法
SELECT JSON_UNQUOTE(JSON_EXTRACT(@json_col,CONCAT('$.people[',num,'].name'))) name
FROM ( SELECT 0 num UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 ) numbers
HAVING name IS NOT NULL;
https://www.db-fiddle.com/f/gP4g2gpYgEq2XtARUf3c38/0
,如果您不介意临时表和存储过程的复杂性,此阐述将创建一个临时表以进行联接:
drop temporary table if exists temp_numbers;
create TEMPORARY TABLE IF NOT EXISTS temp_numbers(
num INT
);
drop procedure if exists fill_num;
delimiter //
create procedure fill_num(in num int)
begin
declare i int default 0;
while (i < num) do
insert into temp_numbers values (i);
set i = i + 1;
end while;
end
//
delimiter ;
SET @json_col = '{
"people": [
{
"name": "John Smith"
},{
"name": "Sally Brown"
},{
"name": "John Johnson"
}
]
}';
set @json_people = json_extract(@json_col,'$.people[*]');
call fill_num(json_length(@json_people));
select json_unquote(json_extract(@json_people,concat('$[','].name'))) from temp_numbers;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。