【问题标题】:How to convert MySQL JSON array to comma separated string如何将 MySQL JSON 数组转换为逗号分隔的字符串
【发布时间】:2019-11-12 02:15:33
【问题描述】:

我在一列中有以下电话号码:

["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]

我怎样才能得到这样的信息:

+63(02)3647766,+63(02)5467329,+63(02)8555522,+63(02)3642403

【问题讨论】:

  • 简单的嵌套 REPLACE() 函数应该可以解决问题,但最干净的版本是将 JSON 数组转换为记录并使用 GROUP_CONCAT().. 那么您使用的是哪个 MySQL 版本?
  • 可以使用 JSON_PRETTY (dev.mysql.com/doc/refman/5.7/en/…) 格式化列
  • 我虽然可能有一个类似 implode 的函数:$array = array('lastname', 'email', 'phone'); $comma_separated = implode(",", $array);
  • 那么你可以使用 REPLACE 函数删除以下字符:'", [, ]'

标签: mysql json mysql-json


【解决方案1】:

我认为这是最唯一的 MySQL 清洁方式,至少对于 8 以下的 MySQL 版本

查询

SET SESSION group_concat_max_len = @@max_allowed_packet;

SELECT
  GROUP_CONCAT(
     JSON_UNQUOTE(
       JSON_EXTRACT(records.json, CONCAT('$[', number_generator.number , ']'))
     )
  )                    

FROM (

  SELECT 
   @row := @row + 1 AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION   SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION  SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2
  CROSS JOIN (
    SELECT @row := -1 
  ) init_user_params 
) AS number_generator
CROSS JOIN (


SELECT 
    json
  , JSON_LENGTH(records.json) AS json_array_length    
FROM (

  SELECT 
   '["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]' AS json
  FROM 
   DUAL  
) AS records

) AS records 
WHERE
    number BETWEEN 0 AND  json_array_length - 1 

结果

| GROUP_CONCAT(
     JSON_UNQUOTE(
       JSON_EXTRACT(records.json, CONCAT('$[', number_generator.number , ']'))
     )
  ) |
| -------------------------------------------------------------------------------------------------------------------------- |
| +63(02)3647766,+63(02)5467329,+63(02)8555522,+63(02)3642403                                                                |

demo

你听说过 JSON_TABLE() 吗? – 牡蛎

我有,我不认为每个人都已经在 MySQL 8 上,但为了完整性我也添加了它。

仅限 MySQL 8.0 查询

SET SESSION group_concat_max_len = @@max_allowed_packet;

SELECT 
 GROUP_CONCAT(item)
FROM JSON_TABLE(
     '["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]'
   , "$[*]"

   COLUMNS (
       rowid FOR ORDINALITY
     , item VARCHAR(100) PATH "$"   
   )
) AS json_parsed  

结果

| GROUP_CONCAT(item)                                          |
| ----------------------------------------------------------- |
| +63(02)3647766,+63(02)5467329,+63(02)8555522,+63(02)3642403 |

demo

REPLACE() 嵌套方法比较麻烦,但应该适用于所有 MySQL 版本。

SELECT 
 REPLACE(
   REPLACE(
      REPLACE(
       '["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]'
       , '['
       , ''
     )
     , ']'
     , ''
   )
   , '"'
   , ''
 )

结果

| REPLACE(
   REPLACE(
      REPLACE(
       '["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]'
       , '['
       , ''
     )
     , ']'
     , ''
   )
   , '"'
   , ''
 ) |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| +63(02)3647766, +63(02)5467329, +63(02)8555522, +63(02)3642403                                                                                                                                      |

demo

【讨论】:

  • 哇,如果你在我发布问题和发布答案时写了那个查询,我向你致敬@Raymond
  • 你听说过 JSON_TABLE() 吗?
  • “你听说过 JSON_TABLE() 吗?”感谢@oysteing yes i have 的评论,但我不认为每个人都已经在 MySQL 8 上,但为了完整性我也添加了它。
【解决方案2】:

所以如果你有替换替换替换功能。它超级酷而且简单。 如果你想构建 varchar 值以逗号分隔,请使用以下内容;

@json_array = ["value1", "value2"]

select replace(replace(replace(json_extract(@json_array, '$'), '"', '\''), '[', ''), ']', '');

但是如果你想构建数字然后使用

select replace(replace(replace(json_extract(@json_array, '$'), '"', ''), '[', ''), ']', '');enter code here

【讨论】:

    【解决方案3】:

    最适合所有 MySQL 版本的解决方案是:

    SELECT
        REPLACE(
            REPLACE(
                REPLACE(
                    records.json,
                    '[',
                    ''
                ),
                ']',
                ''
            ),
            '"',
            ''
        ) AS comma_separated
    FROM (
        SELECT
            '["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]' AS json
    ) AS records;
    

    看起来很重,但它的作用就像一个魅力。

    【讨论】:

      【解决方案4】:

      如果不是你想在这里做的查询是一个简单的函数,你可以传递你的数组并取回字符串。

      $data  = ["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"];
      function MakeAstring($data){
           $array_with_comma = array();
          $last_key = end(array_keys($data));
        foreach($data as $key =>  $number)
         {
           $string .= $number.($key != $last_key ? ',': '');
         }
        return $string;
      }
      echo MakeAstring($data);
      

      【讨论】:

        猜你喜欢
        • 2021-08-09
        • 1970-01-01
        • 2019-11-18
        • 2020-05-21
        • 2011-06-18
        • 2019-05-19
        相关资源
        最近更新 更多