【问题标题】:Extract array in nested JSON object with MYSQL使用 MYSQL 提取嵌套 JSON 对象中的数组
【发布时间】:2020-03-04 12:21:23
【问题描述】:

我正在尝试使用MYSQLJSON 对象中提取一个数组

SELECT json_extract(jsonObjectValue,'$[*].name') as array FROM `TEST` WHERE name='jsonObject'

上面的查询有这个结果

...
["elem1", "elem1", "elem2"]
["elem5", "elem1", "elem2", "elem4"]
...

我尝试通过这样做来提取数组:

SELECT json_extract(json_extract(jsonObjectValue,'$[*].name'),'$[*]') as array FROM `TEST` WHERE name='jsonObject'

想要的结果如下所示:

...
"elem1"
"elem1"
"elem2"
"elem5"
"elem1"
"elem2"
"elem4"
...

但实际结果是:

...
["elem1", "elem1", "elem2"]
["elem5", "elem1", "elem2", "elem4"]
...

我还尝试将 JSON 提取中的 '$[*]' 更改为 '$[0]' 它只显示数组的第一个元素。

更新

重现问题,请运行以下查询:

CREATE TABLE `TEST` (
`jsonObjectValue` varchar(1000) NOT NULL,
`name` varchar(1000) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

对于数据运行:

INSERT INTO `TEST` (`jsonObjectValue`, `name`) VALUES
('[{\"name\":\"elem1\"},{\"name\":\"elem1\"},{\"name\":\"elem2\"}]', 
'JsonObject'),
('test', 'name'),
('test2', 'test2'),
('[{\"name\":\"elem5\"},{\"name\":\"elem1\"},{\"name\":\"elem2\"}, 
{\"name\":\"elem4\"}]', 'jsonObject');

任何帮助将不胜感激。

【问题讨论】:

  • MySQL 版本????
  • 版本是MySQL 5
  • 恐怕你别无选择。使用$[x].name 作为 x 来自数字表 0...999 的路径的蛮力方法可能有效。
  • 提供一些示例数据(或 CREATE TABLE + INSERT INTO 脚本)。
  • 版本为 MySQL 5 将中间数组视为字符串,使用常用字符串函数和生成的数字表进行解析。

标签: mysql arrays json


【解决方案1】:
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(arrays.array, ',', numbers.num), ',', -1)) element
FROM ( SELECT TRIM('[' FROM TRIM(']' FROM json_extract(jsonObjectValue,'$[*].name'))) as array 
       FROM `TEST` 
       WHERE name='jsonObject') arrays,
     ( SELECT 1 num UNION ALL
       SELECT 2 UNION ALL
       SELECT 3 UNION ALL
       SELECT 4 UNION ALL
       SELECT 5 ) numbers
WHERE numbers.num <= LENGTH(arrays.array) - LENGTH(REPLACE(arrays.array, ',', '')) + 1;

fiddle

附言。生成的数字数量必须不小于单独数组中元素的最大数量 - 如果不是,某些值将会丢失。

【讨论】:

  • 感谢@Akina 的回答,这太复杂了,我只是解决了部分问题,最终结果太大而无法实现......
  • @KamelMili 将您的 MySQL 更新到最新版本,并使用 JSON_TABLE() 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多