如何使用组concat mysql创建json格式?

如何使用组concat mysql创建json格式?,mysql,sql,group-concat,Mysql,Sql,Group Concat,如何使用组concat mysql创建json格式 (我使用MySQL) 例1: 表1: email | name | phone ------------------------------------- my1@gmail.com | Ben | 6555333 my2@gmail.com | Tom | 2322452 my2@gmail.com | Dan | 8768768 my1@gmail.com

如何使用组concat mysql创建json格式

(我使用MySQL)

例1:

表1:

email            |    name  |   phone
-------------------------------------
my1@gmail.com    | Ben      | 6555333
my2@gmail.com    | Tom      | 2322452
my2@gmail.com    | Dan      | 8768768
my1@gmail.com    | Joi      | 3434356
像语法代码一样,没有给出格式:

从表1中选择电子邮件、通话组(姓名、电话)作为列表
通过电子邮件分组
我需要的输出:

email         |    list
------------------------------------------------
my1@gmail.com |  {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
my2@gmail.com |  {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
谢谢

尝试此查询-

SELECT
  email,
  GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
  table1
GROUP BY
  email;
JSON格式结果-

+---------------+-------------------------------------------------------------+
| email         | list                                                        |
+---------------+-------------------------------------------------------------+
| my1@gmail.com | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| my2@gmail.com | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} |
+---------------+-------------------------------------------------------------+
像这样使用

SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;

干杯

上面德瓦特的回答很好,但K2xL的问题是正确的。我找到的答案是使用HEX()对名称列进行十六进制编码,这确保它将创建有效的JSON。然后在应用程序中,将十六进制转换回字符串

(很抱歉自我推销,但是)我写了一篇关于这一点的博文,其中有更多的细节:

[Edit for Oriol]以下是一个示例:

SELECT email,
    CONCAT(
        '[',
        COALESCE(
            GROUP_CONCAT(
                CONCAT(
                    '{',
                    '\"name\": \"', HEX(name), '\", ',
                    '\"phone\": \"', HEX(phone), '\"',
                    '}')
                ORDER BY name ASC
                SEPARATOR ','),
            ''),
        ']') AS bData
FROM table
GROUP BY email

另外请注意,我添加了一个COALESCE,以防该电子邮件没有条目。

对于较新版本的MySQL,您可以使用JSON_对象函数来实现所需的结果,如下所示:

GROUP_CONCAT(
  JSON_OBJECT(
    'name', name,
    'phone', phone
  )
) AS list
要准备将SQL响应解析为数组,请执行以下操作:

CONCAT(
  '[',
  GROUP_CONCAT(
    JSON_OBJECT(
      'name', name,
      'phone', phone
    )
  ),
  ']'
) AS list

这将为您提供一个字符串,如:
[{name:'ABC',phone:'111'},{name:'DEF',phone:'222'}]
,可以对其进行JSON解析。希望这有帮助。

偏离@Devart的答案。。。如果字段包含换行符或双引号,则结果将无效

因此,如果我们知道“phone”字段偶尔包含双引号和换行符,我们的SQL将如下所示:

SELECT email, CONCAT( '[', GROUP_CONCAT(CONCAT( '{name:"', name, '", phone:"', REPLACE(REPLACE(phone, '"', '\\\\"'),'\n','\\\\n'), '"}' )), ']' ) AS list FROM table1 GROUP BY email; 挑选 电子邮件, 海螺( '[', 组_CONCAT(CONCAT( “{name:”, 名称 “,电话:”, 替换(替换(电话“,”\\\“,”),“\n”,“\\\\n”), '"}' )), ']' )作为列表 通过电子邮件从表1分组;

如果本手机在其中间有一个引号,Joi的电话有一个换行符,SQL会给出(有效JSON)结果,如:

[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]
[{name:“Ben”,phone:“655\“5333”},{name:“Joi”,phone:“343\n4356”}]

您可以使用:

对于阵列():

对于对象():

对于Mysql 5.7.22+
选择
电子邮件,
雅格(
JSON_对象(
“名字”,名字,
电话,电话
)
)作为列表
来自表1
通过电子邮件分组;
结果:
唯一的区别是,
list
列现在是Json有效的,因此您可以直接解析为Json

,与上面Madacol的答案类似,但略有不同。您也可以转换为Json,而不是JSONARRAYAGG:

SELECT
        email,
       CAST( CONCAT(
        '[', 
           GROUP_CONCAT(
           JSON_OBJECT(
              'name', name,
              'phone', phone
            )
        ),']') AS JSON )
    FROM table1
    GROUP BY email;
结果:

+---------------+-------------------------------------------------------------------+
| email         | list                                                              |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+



如果您的数据库将增长,这是一个坏主意。最好在您的应用程序中使用代码。db static for readonly parpose如果名称包含双引号会发生什么情况?这取决于ANSI_QUOTES SQL模式,如果它被激活-那么您应该在名称中使用双引号,否则它将工作。很抱歉,这不是有效的JSON。。。一个JSON数组包含在[and]之间,作为我的编辑的旁注,如果您可以选择的话,您可以使用MySQL 5.7中的新JSON函数。请参阅:@AntonioOrtells,为了使其有效,您和我都会使用
CONCAT('[',GROUP_-CONCAT(…),']')列表调整部分
,这会将其包装在数组括号中,而GROUP_-CONCAT中的逗号会执行其余操作。在您的答案中添加复杂的CONCAT示例。我认为这很有帮助;-)这解决了我的问题,其他解决方案在解码带有无效字符(如制表符、斜杠等)的json时失败,
name
phone
键必须位于
(双引号)中才能表示有效的jsonkekko12:Fixed。谢谢
TO_BASE64
可能会降低
HEX
引入的额外成本(即:字符串较短)。但是对于现在的MySQLsIs,有一个类似于
->
->
的速记,但是对于
CONCAT('[',GROUP_-CONCAT(JSON_-OBJECT(…)SEPARATOR','),'),']'),
,有没有关于如何使用
IF
省略空白记录的建议?如果它是一个空记录集,那么它如何返回
{“name”:null,“phone”:null}
。将抛出一个警告(和不一致的结果),因为您正在使用
GROUP BY
子句检索一个未分组的非唯一列(如果
ur_name_列
包含双引号或黑斜杠,则容易出现JSOn注入)重要的是要注意,这些在5.7.22+中可用,在撰写本评论时,它们在Amazon aurora 5.7中都不可用。您的DBMS是什么?您可以在sql Server中使用json路径对不起,我错过了这一点。这是Mysql 5.7.26唯一需要记住的事情,就像在使用
GROUP_CONCAT
时,您只能有1024个字符只有如果你的JSON有更多的长度,那么我建议下面的答案。
+---------------+-------------------------------------------------------------------+
| email         | list                                                              |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+
SELECT
        email,
       CAST( CONCAT(
        '[', 
           GROUP_CONCAT(
           JSON_OBJECT(
              'name', name,
              'phone', phone
            )
        ),']') AS JSON )
    FROM table1
    GROUP BY email;
+---------------+-------------------------------------------------------------------+
| email         | list                                                              |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+