Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中如何将结果表转换为JSON数组_Mysql_Json_Etl_Data Conversion - Fatal编程技术网

MySQL中如何将结果表转换为JSON数组

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中

我想在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解决方案。

您可以使用它将行作为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_数组