mySQL 5.7 使用新的 json 功能将行作为 json 返回

Posted

技术标签:

【中文标题】mySQL 5.7 使用新的 json 功能将行作为 json 返回【英文标题】:mySQL 5.7 return row as json using new json features 【发布时间】:2016-05-21 08:54:22 【问题描述】:

我正在查看一些新的JSON features,并想知道是否有一种聪明(或明显)的方法可以将行集作为 JSON 对象返回。理想情况下,无需命名键或使用任何类型的字符串操作。

例子:

TABLE: people
id     name     age
1      bob      54
2      jay      32
3      john     10

SELECT * FROM people where id = 1

会回来

"id":1,"name":"bob","age":54

甚至更好

SELECT * FROM people

将返回一个包含所有 3 个对象的数组

如果您不熟悉 JSON 的新功能,其中一个新功能是JSON_OBJECT

SELECT JSON_OBJECT('key1', 1, 'key2', 'abc')

将返回一个键值 JSON 对象。

【问题讨论】:

【参考方案1】:

取决于“命名键或任何类型的字符串操作”的含义。如果您乐于将键的命名和字符串操作封装在存储过程中,以便在 调用 过程时不需要命名键,那么是的,您可以:

drop procedure if exists spGetJson;
delimiter $$
create procedure spGetJson(pTableName varchar(45), pId int)
begin

select  group_concat(concat("'", COLUMN_NAME, "', ", COLUMN_NAME) separator ',')
into    @cols
from    information_schema.columns
where   TABLE_NAME = pTableName and TABLE_SCHEMA = database();

set @q = concat('select json_object(', @cols, ') from ', pTableName);
if pId is not null then
    set @q = concat(@q, ' where id = ', pId);
end if;
set @q = concat(@q, ';');

prepare statement from @q;
execute statement;
deallocate prepare statement;

end $$
delimiter ;

然后您可以使用以下任一方法调用此过程:

call spGetJson('people', 1);
call spGetJson('people', null);

【讨论】:

给定问题中的样本数据,每个调用的输出是什么?具体来说,您是说第一次调用将返回一个包含"id":1,"name":"bob","age":54 的json 对象,正如问题中所要求的那样?

以上是关于mySQL 5.7 使用新的 json 功能将行作为 json 返回的主要内容,如果未能解决你的问题,请参考以下文章

mysql.5.7版以上的对JSON数据操作

mysql JSON_SET 无法插入具有 NULL 值的列(5.7+)

MySQL 5.7原生JSON格式支持

创建新的 AWS RDS 实例并导入数据,而不是将 MySQL 版本从 5.6 更新到 5.7

MySQL 5.7原生JSON格式支持

MySql 将行放入单个 JSON 对象