MySQL 中的 JSON:从键范围内的对象获取数据 我有什么:我想要的:我在互联网上搜索的内容:

问题描述

我有什么:

  • 一张MysqL的桌子,比如说table1
  • table1 包含两列即。 iddata
  • idint 但扭曲是 dataJSON 类型并且它的键是可比的
  • table1 包含只有一行 (为了这个问题)

table1

id 数据
1 {'1': 'content1','2': 'content2','3':'content3',......,'10000':'content10000' }

我想要的:

我想要一个查询,以便它返回一个键范围内的键值对,比如 100 到 200。

我在互联网上搜索内容

我在任何地方都只能得到答案,其中人们可以获得具有范围内值的行,但这里的情况是我想要范围内的键值。

解决方法

好的,我从这个数据开始:

MariaDB [test]> select * from table1;
+------+---------------------------------------------------------------------------+
| id   | data                                                                      |
+------+---------------------------------------------------------------------------+
|    1 | {"1": "content1","2": "content2","3":"content3","10000":"content10000"} |
+------+---------------------------------------------------------------------------+

查询:

WITH RECURSIVE data AS (
  SELECT 
     JSON_VALUE(JSON_KEYS(data),'$[0]') AS k,JSON_EXTRACT(data,CONCAT('$.',JSON_VALUE(JSON_KEYS(data),'$[0]'))) AS v,0 AS idx 
  FROM table1
  UNION
  SELECT 
     JSON_VALUE(JSON_KEYS(data),CONCAT('$[',d.idx + 1,']')) AS k,']')))) AS v,d.idx + 1 AS idx 
  FROM data AS d,table1
  WHERE d.idx < JSON_LENGTH(JSON_KEYS(data)) - 1
) SELECT * FROM data;

样本输出(因为如果只有有限的数据):

+-------+----------------+------+
| k     | v              | idx  |
+-------+----------------+------+
| 1     | "content1"     |    0 |
| 2     | "content2"     |    1 |
| 3     | "content3"     |    2 |
| 10000 | "content10000" |    3 |
+-------+----------------+------+

添加 WHERE 子句应该不是问题。