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

如何在Grafana中创建并以表格形式访问PostgreSQL多列查询变量?

在Grafana中用PostgreSQL实现多列表格式变量访问

默认情况下,Grafana的查询变量会把多列查询结果拆成扁平的集合,丢失了id和name的对应关系,没法直接像表格一样操作。要解决这个问题,得通过JSON序列化的方式保存结构化数据,再在查询中解析,具体步骤如下:

1. 修改变量查询,返回JSON格式数据

把原来的查询改成将结果序列化为JSON数组,让变量存储完整的键值对结构:

SELECT json_agg(row_to_json(t)) FROM (SELECT id, name FROM country) t;

这个查询会返回类似这样的JSON字符串:
[{"id":1,"name":"spain"},{"id":2,"name":"germany"},{"id":3,"name":"usa"}]

2. 配置变量

在Grafana的变量设置里:

  • 类型选「查询」,数据源选你的PostgreSQL实例
  • 输入上面的查询语句,给变量起个名字(比如country_data),保存即可

3. 在面板查询中解析JSON变量

在需要使用该表格数据的面板查询里,用PostgreSQL的jsonb_to_recordset函数把JSON字符串解析成临时表,就能像操作普通数据库表一样访问id和name了:

示例1:根据选中的ID获取对应名称

如果你有一个选择国家ID的变量selected_id,可以这样写查询:

SELECT name 
FROM jsonb_to_recordset(${country_data:raw}::jsonb) AS t(id int, name text) 
WHERE id = ${selected_id};

示例2:关联其他表查询

要是需要和其他表关联,比如和city表联动获取对应国家的城市:

SELECT c.name AS city_name, t.name AS country_name
FROM city c
JOIN jsonb_to_recordset(${country_data:raw}::jsonb) AS t(id int, name text)
ON c.country_id = t.id;

为什么之前的写法没用

Grafana默认的多列变量会把所有列的值拼接成扁平的列表,完全丢失了id和name的对应关系,所以$(variable.name)这类写法根本识别不了结构化数据,必须先通过JSON序列化保留数据结构,再用数据库函数解析才能用。

内容的提问来源于stack exchange,提问作者Aitor Uaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:30:05