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
相关产品推荐
相关产品推荐

