问题描述
我有什么:
- 一张
MysqL
的桌子,比如说table1
-
table1
包含两列即。id
和data
-
id
是int
但扭曲是data
是JSON
类型并且它的键是可比的 -
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 子句应该不是问题。