从数组 JSON 中选择元素范围

select range of element from array json

提问人:Amr Elkady 提问时间:11/15/2023 最后编辑:Bill KarwinAmr Elkady 更新时间:11/16/2023 访问量:34

问:

SELECT JSON_EXTRACT(data, '$.rows[*]') AS name from my_table ;

数据列是json列,包含行作为数组元素需要从行中选择一系列元素[如分页]

尝试直接从数据库进行分页以选择例如大小为 25 的第一页,然后是第二页,但从第一页的最后一页开始。

编号 数据
1 {“rows”:[{“name”:“name_1”},{“name”:“name_2”},{“name”:“name_3”},{“name”:“name_4”}]}
数据库 mysql-json

评论

1赞 Akina 11/15/2023
根据提出一个好的结构化查询语言 (SQL) 问题的提示 #5 和 #3 提供示例数据。
0赞 Amr Elkady 11/15/2023
检查,我提供了一个示例数据
0赞 CBroe 11/15/2023
如果您将如此多的数据放入 JSON 列中,则需要该分页才能显示它......那么我会说这是一个相当糟糕的数据模型。
2赞 Kaddath 11/15/2023
如果你有一个包含数十行分页的大型 JSON 字段,我会说这是一种无效的数据存储方式。我会以不同的方式存储它。假设你想保持这种状态,考虑到mySQL每次都必须读取整个字段来提取JSON属性,那么获取一次完整的值,解码JSON客户端并从中分页应该会更快。
1赞 Barmar 11/16/2023
JSON 数据类型乍一看总是很方便,但实际上它使事情变得更加困难。JSON 不太适合 SQL 的关系模型。

答:

0赞 Bill Karwin 11/16/2023 #1

这是一个解决方案:

SELECT JSON_OBJECT('rows', JSON_ARRAYAGG(JSON_OBJECT('name', t.name))) AS data
FROM (
  SELECT j.name
  FROM my_table
  CROSS JOIN JSON_TABLE(my_table.data, '$.rows[*]' COLUMNS (
      ord FOR ORDINALITY,
      name VARCHAR(20) PATH '$.name'
    )
  ) AS j
  WHERE j.ord BETWEEN 1 and 25
) AS t;

对参数使用不同的数字来获取数组的其他“页面”。BETWEEN

如果这看起来太复杂,那么您应该将数据存储在普通的行和列中,而不是 JSON。