0

我有的:

  • 一张mysql桌子,说table1
  • table1包含两列,即。iddata
  • idint,但扭曲是data类型JSON它的键是可比的
  • table1仅包含一行 (为了这个问题

表格1

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

我想拥有的:

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

我在互联网上搜索的内容:

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

4

1 回答 1

3

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

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, 
     JSON_EXTRACT(data, CONCAT('$.',JSON_VALUE(JSON_KEYS(data), CONCAT('$[', d.idx + 1, ']')))) 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 子句应该不是问题。

于 2021-03-10T16:44:27.227 回答