mysql遍历json字符串获取所有value
时间: 2025-06-29 08:02:51 浏览: 2
### 解析 MySQL 中的 JSON 字符串
在 MySQL 中处理 JSON 数据时,可以利用内置函数 `JSON_TABLE` 和其他辅助函数来提取和遍历 JSON 对象中的所有值。对于复杂结构的数据,这种方法尤为有效。
#### 使用 JSON_TABLE 函数解析 JSON 数组
假设有一个表名为 `example_table` 的表格,其中包含一列 `json_column` 存储着如下形式的 JSON 数组:
```json
[
{"key": "a", "value": 1},
{"key": "b", "value": 2}
]
```
为了从中抽取所有的键值对,特别是获取所有的 `value` 值,可以通过下面的方式实现:
```sql
SELECT jt.value FROM example_table,
JSON_TABLE(
json_column,
'$[*]' COLUMNS (
key CHAR(10) PATH '$.key',
value INT PATH '$.value'
)
) AS jt;
```
这段 SQL 查询语句定义了一个内联视图 `jt` 来表示通过 `JSON_TABLE()` 函数转换后的临时关系型数据集。这里指定了两个字段:一个是字符类型的 `key`;另一个是整数类型的 `value`。最后选择了这些记录里的 `value` 列作为输出结果[^1]。
如果遇到更复杂的嵌套情况,比如多层对象或数组,则可能需要多次调用 `JSON_EXTRACT` 或者调整路径表达式的写法以适应具体需求[^2]。
#### 处理单个 JSON 对象的情况
当面对的是单一的对象而非数组时,同样适用上述方法,只需修改路径表达式即可满足不同的层次结构要求。例如给定这样的 JSON 文本:
```json
{
"row_1": {"id": 1, "data": "first"},
"row_2": {"id": 2, "data": "second"}
}
```
此时应构建相应的查询逻辑去适配这种特定模式下的键名变化规律:
```sql
WITH RECURSIVE keys AS (
SELECT
JSON_KEYS(json_column) as all_keys,
1 as level
FROM example_table
UNION ALL
SELECT
JSON_UNQUOTE(JSON_EXTRACT(all_keys, CONCAT('$[', level - 1, ']'))) as single_key,
level + 1
FROM keys
WHERE JSON_LENGTH(all_keys) >= level
)
SELECT DISTINCT k.single_key,
JSON_UNQUOTE(JSON_EXTRACT(t.json_column, CONCAT('$.', k.single_key, '.id'))) as id_val,
JSON_UNQUOTE(JSON_EXTRACT(t.json_column, CONCAT('$.', k.single_key, '.data'))) as data_val
FROM keys k CROSS JOIN example_table t
WHERE k.level > 1 AND k.single_key IS NOT NULL;
```
此脚本首先创建一个递归公用表表达式(CTE),用于迭代地展开顶层键列表。接着,在主查询部分连接原始表与生成的键集合,并针对每一个键执行两次 `JSON_EXTRACT` 调用来分别取得对应的 `id` 和 `data` 属性值。
阅读全文
相关推荐

















