UPDATE:这在MySQL 8中现在可以通过JSON_表函数实现:https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

我很喜欢MySQL 5.7中的新JSON函数,但在try 将JSON中的值合并到正常表 struct 时遇到了问题.

获取JSON、操作并从中提取数组等都很简单.一路提取.但是反过来呢,从JSON数组到行呢?也许我对现有的MySQL JSON功能很了解,但我还没有弄明白这一点.

例如,假设我有一个JSON数组,并想为数组中的每个元素插入一行及其值?我找到的唯一方法是编写一组JSON_EXTRACT(…'$[0]')JSON_EXTRACT(…'$[1]')等,并将它们结合在一起.

或者,假设我有一个JSON数组,想要将它分组为一个逗号分隔的字符串?

换句话说,我知道我能做到:

SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, CONCAT('$[', x.n, ']'))) AS val
  FROM   
  (    
    SELECT 0 AS n    
    UNION    
    SELECT 1 AS n    
    UNION    
    SELECT 2 AS n    
    UNION    
    SELECT 3 AS n    
    UNION    
    SELECT 4 AS n    
    UNION    
    SELECT 5 AS n    
  ) x
WHERE x.n < JSON_LENGTH(@j);

但这伤了我的眼睛.还有我的心.

我怎样才能做到:

SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, '$[ * ]'))

... 让它将数组中的值与JSON数组本身连接起来?

我想我在这里要寻找的是某种JSON_分割,大致如下:

SET @j = '[1, 2, 3]';

SELECT GROUP_CONCAT(val)
FROM
  JSON_SPLIT(JSON_EXTRACT(@j, '$[ * ]'), '$')

如果MySQL有一个正确的STRING_SPLIT(val,'separator')表返回函数,我可以破解它(该死的转义),但这也不可用.

推荐答案

以下是如何在MySQL 8+中使用JSON_TABLE实现这一点:

SELECT *
     FROM
       JSON_TABLE(
         '[5, 6, 7]',
         "$[*]"
         COLUMNS(
           Value INT PATH "$"
         )
       ) data;

您还可以将其用作MySQL缺少的通用字符串拆分函数(类似于PG的regexp_split_to_表或MSSQL的string_split),方法是将分隔字符串转换为JSON字符串:

set @delimited = 'a,b,c';

SELECT *
     FROM
       JSON_TABLE(
         CONCAT('["', REPLACE(@delimited, ',', '", "'), '"]'),
         "$[*]"
         COLUMNS(
           Value varchar(50) PATH "$"
         )
       ) data;

Mysql相关问答推荐

MySQL 运行自动脚本

MySQL - 密码哈希没有预期的格式

避免多个SQL查询的重构代码

生成json数据并根据特定表的匹配条件进行过滤

如何在 Shopware 6 DAL 中实施 Haversine 公式?

mySql 查询运行速度超慢

MySql部分匹配基于部分查询代码

非常规字符的不正确字符串值错误

Mysql insert with loop out of select 语句

MySQL 查询组按日期(12 小时间隔)

具有别名主机的 ssh 反向 mysql tunel

使用case查询并更新最后一条记录

提高mysql导入速度

最好的 MySQL 性能调优工具?

从终端访问 MAMP 的 MySQL

将 MySQL 查询的输出转换为 utf8

你如何在 Node.js 中模拟 MySQL(没有 ORM)?

如何在mysql中连接整数(整数和整数)和varchar(nvarchar和varchar)等数据类型?

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

如何允许 django 管理员将字段设置为 NULL?