MySQL中如何将结果表转换为JSON数组
我想在MySQL中将结果表转换为JSON数组,最好只使用普通的MySQL命令。例如查询MySQL中如何将结果表转换为JSON数组,mysql,json,etl,data-conversion,Mysql,Json,Etl,Data Conversion,我想在MySQL中将结果表转换为JSON数组,最好只使用普通的MySQL命令。例如查询 SELECT name, phone FROM person; | name | phone | | Jack | 12345 | | John | 23455 | 预期的JSON输出将是 [ { "name": "Jack", "phone": 12345 }, { "name": "John", "phone": 23455 } ] 在普通MySQL中
SELECT name, phone FROM person;
| name | phone |
| Jack | 12345 |
| John | 23455 |
预期的JSON输出将是
[
{
"name": "Jack",
"phone": 12345
},
{
"name": "John",
"phone": 23455
}
]
在普通MySQL中有这样做的方法吗
编辑:
例如,有一些答案可以解决这个问题,但我找不到纯MySQL解决方案。您可以使用它将行作为JSON对象获取
SELECT json_object('name', name, 'phone', phone)
FROM person;
这不会将它们放入数组中,也不会在它们之间放置逗号。您必须在获取它们的代码中执行此操作。新解决方案:
使用您的精彩评论构建,谢谢
SELECT JSON_ARRAYAGG(JSON_OBJECT('name', name, 'phone', phone)) from Person;
旧的解决方案: 在@Schwern的帮助下,我成功地提出了这个查询,看起来很有效
SELECT CONCAT(
'[',
GROUP_CONCAT(JSON_OBJECT('name', name, 'phone', phone)),
']'
)
FROM person;
JSON有两个名为JSON_arrayagg、JSON_objectagg的“group by”函数
可以通过以下方法解决此问题:
SELECT json_arrayagg(
json_merge(
json_object('name', name),
json_object('phone', phone)
)
) FROM person;
这需要MySQL 5.7+。如果您像我一样一直使用MySQL 5.6,请尝试以下方法:
SELECT
CONCAT(
'[',
GROUP_CONCAT(
CONCAT(
'{"name":"', name, '"',
',"phone":"', phone, '"}'
)
),
']'
) as json
FROM person
如果您需要一个嵌套的JSON数组对象,您可以将JSON_对象与JSON_ArrayAg连接,如下所示:
{
"nome": "Moon",
"resumo": "This is a resume.",
"dt_inicial": "2018-09-01",
"v.dt_final": null,
"data": [
{
"unidade": "unit_1",
"id_unidade": 9310
},
{
"unidade": "unit_2",
"id_unidade": 11290
},
{
"unidade": "unit_3",
"id_unidade": 13544
},
{
"unidade": "unit_4",
"id_unidade": 13608
}
]
}
你可以这样做:
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_lst_caso`(
IN `codigo` int,
IN `cod_base` int)
BEGIN
DECLARE json TEXT DEFAULT '';
SELECT JSON_OBJECT(
'nome', v.nome,
'dt_inicial', v.dt_inicial,
'v.dt_final', v.dt_final,
'resumo', v.resumo,
'data', ( select json_arrayagg(json_object(
'id_unidade',`tb_unidades`.`id_unidade`,
'unidade',`tb_unidades`.`unidade`))
from tb_caso_unidade
INNER JOIN tb_unidades ON tb_caso_unidade.cod_unidade = tb_unidades.id_unidade
WHERE tb_caso_unidade.cod_caso = codigo)
) INTO json
FROM v_caso AS v
WHERE v.codigo = codigo and v.cod_base = cod_base;
SELECT json;
END
GROUP_CONCAT和CONCATHow的组合你在运行这个查询吗?虽然有点晚,但我认为答案应该提到这一点,
json_object
仅适用于MySQL 5.7
和higher@toolmakersteve干杯我已经等了两年了nugget@Strawberry我目前正在研究的用例是使用表B的查询结果更新表a中的JSON列。将数据格式化为JSON允许您在单个查询中完成此操作。谢谢,这已经非常接近了!我还在试验如何从这些对象构造数组。我得到了这个错误1305(42000):函数mydb.JSON_对象不存在错误。如何确保此功能存在?@AnthonyKong您使用的是什么版本json_object
只能在5.7
及更高版本中使用。我更喜欢这个选项而不是选择的“正确”答案,因为它将每个条目作为自己的行返回。有了这个,您可以将结果流式传输回来。如果您使用的是mysql客户端,那么它将处理任何查询。输出可能会被截断,因为组_concat_max_len为什么不使用,JSON_数组(JSON_对象('name',name','phone',phone))
。@darckblezer您的提议的输出似乎是一组列表:[{“name”:“Jack”,“phone”:“12345”}][{“name”:“John”,“phone”:“23455”}]
(请参阅)@darckblezer而不是JSON_数组
而是JSON_数组