在MySQL中将json数组作为字符串连接

xhv8bpkk  于 2023-03-28  发布在  Mysql
关注(0)|答案(2)|浏览(265)

我在mysql表中有这些行。
tags是一个json类型的列,存储的是json数组。

id  tags
1   ["a", "b"]
2   ["a", "b", "c"]
3   []

我想返回数组元素的连接值。
即)

id  tags
1   "a, b"
2   "a, b, c"
3   ""

mysql有没有什么函数可以做到这一点?
※这只是一个示例表,所以为什么tags是json数组并不重要,对不起。

jgzswidk

jgzswidk1#

这需要使用MySQL 8.0中支持的JSON_TABLE()函数:

mysql> select id, j.tag from mytable 
  left join json_table(tags, '$[*]' columns( tag varchar(10) path '$' )) j 
  on true; 
+------+------+
| id   | tag  |
+------+------+
|    1 | a    |
|    1 | b    |
|    2 | a    |
|    2 | b    |
|    2 | c    |
|    3 | NULL |
+------+------+

mysql> select id, group_concat(j.tag) as tags from mytable 
  left join json_table(tags, '$[*]' columns( tag varchar(10)
path '$' )) j 
  on true 
  group by id;
+------+-------+
| id   | tags  |
+------+-------+
|    1 | a,b   |
|    2 | a,b,c |
|    3 | NULL  |
+------+-------+
o7jaxewo

o7jaxewo2#

您可以这样做:

SELECT
  `id`,
  /* tags_joined */ (
    SELECT
      COALESCE(
        GROUP_CONCAT(`jsontable`.`item` SEPARATOR ', '), -- join array items
        '' -- fallback value for nonexistent or empty array
      )
    FROM
      `my_table` AS `jsonsource`, -- alias for WHERE
      -- implicit lateral join
      JSON_TABLE(
        `jsonsource`.`tags`,
        '$[*]' -- path to array items
        COLUMNS(`item` VARCHAR(10) PATH '$') -- array item to table column
      ) AS `jsontable`
    WHERE `jsonsource`.`id` = `my_table`.`id` -- current row only
  ) AS `tags_joined`
FROM `my_table`

相关问题