如何将 MySQL JSON 数组转换为逗号分隔的字符串

Mih*_*aga 5 mysql json mysql-json

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

["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]
Run Code Online (Sandbox Code Playgroud)

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

+63(02)3647766,+63(02)5467329,+63(02)8555522,+63(02)3642403
Run Code Online (Sandbox Code Playgroud)

Ray*_*and 7

我认为这是最简单的 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 
Run Code Online (Sandbox Code Playgroud)

结果

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

演示

你听说过 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  
Run Code Online (Sandbox Code Playgroud)

结果

| GROUP_CONCAT(item)                                          |
| ----------------------------------------------------------- |
| +63(02)3647766,+63(02)5467329,+63(02)8555522,+63(02)3642403 |
Run Code Online (Sandbox Code Playgroud)

演示

REPLACE()嵌套方法是较为凌乱,但应该对所有的MySQL版本。

SELECT 
 REPLACE(
   REPLACE(
      REPLACE(
       '["+63(02)3647766", "+63(02)5467329", "+63(02)8555522", "+63(02)3642403"]'
       , '['
       , ''
     )
     , ']'
     , ''
   )
   , '"'
   , ''
 )
Run Code Online (Sandbox Code Playgroud)

结果

| 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                                                                                                                                      |
Run Code Online (Sandbox Code Playgroud)

演示


小智 5

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

@json_array = [“值1”,“值2”]

select replace(replace(replace(json_extract(@json_array, '$'), '"', '\''), '[', ''), ']', '');
Run Code Online (Sandbox Code Playgroud)

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

select replace(replace(replace(json_extract(@json_array, '$'), '"', ''), '[', ''), ']', '');enter code here
Run Code Online (Sandbox Code Playgroud)