JSON in MySQL : 从键范围内的对象获取数据
JSON in MySQL : get data from an object within a range of keys
我有:
- A
mysql
table, 说 table1
table1
包含两列,即。 id
和 data
id
是 int
但扭曲是 data
是 JSON
类型并且 它的键是可比较的
table1
只包含一行(为了这个问题)
table1
id
data
1
{'1': 'content1', '2': 'content2', '3':'content3',.......,'10000':'content10000' }
我想要的东西:
我想要一个查询,这样它 returns 我的键值对在一个键范围内,比如 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,
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 子句应该不是问题。
我有:
- A
mysql
table, 说table1
table1
包含两列,即。id
和data
id
是int
但扭曲是data
是JSON
类型并且 它的键是可比较的table1
只包含一行(为了这个问题)
table1
id | data |
---|---|
1 | {'1': 'content1', '2': 'content2', '3':'content3',.......,'10000':'content10000' } |
我想要的东西:
我想要一个查询,这样它 returns 我的键值对在一个键范围内,比如 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,
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 子句应该不是问题。