如何将结果 table 转换为 MySQL 中的 JSON 数组
How to convert result table to JSON array in MySQL
我想将结果 table 转换为 MySQL 中的 JSON 数组,最好只使用普通的 MySQL 命令。例如查询
SELECT name, phone FROM person;
| name | phone |
| Jack | 12345 |
| John | 23455 |
预期的 JSON 输出将是
[
{
"name": "Jack",
"phone": 12345
},
{
"name": "John",
"phone": 23455
}
]
有没有简单的方法MySQL?
编辑:
有一些答案如何使用例如MySQL and PHP,但我找不到纯粹的 MySQL 解决方案。
您可以使用 json_object 获取行作为 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。
这个问题可以通过以下方式解决:
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_OBJECT和json_arrayagg 如下:
{
"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
我想将结果 table 转换为 MySQL 中的 JSON 数组,最好只使用普通的 MySQL 命令。例如查询
SELECT name, phone FROM person;
| name | phone |
| Jack | 12345 |
| John | 23455 |
预期的 JSON 输出将是
[
{
"name": "Jack",
"phone": 12345
},
{
"name": "John",
"phone": 23455
}
]
有没有简单的方法MySQL?
编辑:
有一些答案如何使用例如MySQL and PHP,但我找不到纯粹的 MySQL 解决方案。
您可以使用 json_object 获取行作为 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。
这个问题可以通过以下方式解决:
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_OBJECT和json_arrayagg 如下:
{
"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