You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clickhouse如何从JSON数组字符串提取相同Key的所有值?

提取JSON数组中所有指定Key的取值

针对你遇到的JSON数组字符串中无法用JsonExtract提取所有重复Key值的问题,可以通过拆分JSON数组为单个元素再提取的方式解决,以下是不同场景的具体实现:

一、SQL数据库环境

MySQL

使用JSON_TABLE函数将JSON数组转换为关系表,再提取指定字段:

SELECT j.metric
FROM JSON_TABLE(
    '[{"id":"1", "metric":"11"}, {"id":"1", "metric":"12"}]',
    '$[*]' COLUMNS (metric VARCHAR(10) PATH '$.metric')
) AS j;

执行后会返回两行结果:11和12。

PostgreSQL

使用json_array_elements(或jsonb_array_elements)解析数组,再提取字段:

SELECT (elem->>'metric') AS metric
FROM json_array_elements('[{"id":"1", "metric":"11"}, {"id":"1", "metric":"12"}]'::json) AS elem;

同样会返回包含11和12的结果集。

二、编程语言环境

Python

借助json模块解析数组后遍历提取:

import json

json_str = '[{"id":"1", "metric":"11"}, {"id":"1", "metric":"12"}]'
data_list = json.loads(json_str)
metrics = [item["metric"] for item in data_list]
print(metrics)  # 输出: ['11', '12']

Java(Jackson库)

解析JSON数组后循环提取指定字段:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;

public class MetricExtractor {
    public static void main(String[] args) throws Exception {
        String jsonStr = "[{\"id\":\"1\", \"metric\":\"11\"}, {\"id\":\"1\", \"metric\":\"12\"}]";
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode arrayNode = objectMapper.readTree(jsonStr);
        
        List<String> metrics = new ArrayList<>();
        for (JsonNode node : arrayNode) {
            metrics.add(node.get("metric").asText());
        }
        
        System.out.println(metrics);  // 输出: [11, 12]
    }
}

核心思路:JsonExtract只能提取单个路径的JSON值,而JSON数组需要先拆解为独立的对象元素,再逐个提取目标Key对应的取值。

内容的提问来源于stack exchange,提问作者Axel HK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:33:21