QuestDB 列名称的正则表达式

问题描述 投票:0回答:1

QuestDB 是否可以根据列名本身选择一系列列?

例如,我有大量且数量可变的列,其名称为

parameter_X
parameter_1
parameter_2
...)。我希望能够选择与此前缀匹配的所有列,因为它们的数量很大(1000+)且数量不确定。理想情况下,我能够做这样的事情:

SELECT "parameter_*" from MyTable;

我查看了 QuestDB 文档中的正则表达式和表元数据。看起来不可能在

SELECT
子句中使用正则表达式(仅在
WHERE
子句中)。我也无法从
table_columns('MyTable')
执行复合查询,其中结果可以用作
SELECT
子句中的列名称。我已经查看了 QuestDB 中元函数的页面,但无法为这个问题提供可行的解决方案。

有人知道这是否可能吗?我在 Grafana 中创建此查询,因此我可以使用 SQL,但无法轻松地以编程方式操作中间结果。

database time-series questdb
1个回答
0
投票

有两种选择可以执行此操作:一种涉及 Grafana(因为您已经在使用它),另一种向 QuestDB 发送两个单独的查询。

Grafana 解决方案

在 Grafana 中,您可以在查询中插入变量,QuestDB 连接器会尊重它们。这些变量通常用于从下拉列表或日期范围捕获动态值,但它们也可用于执行任何任意 SQL 并仅在变量中返回结果。

如果您进入 Grafana 中的仪表板设置,您将找到变量选项。您可以使用如下 SQL 添加名为

column_list
的变量:

select string_agg(`column`, ',')  from table_columns('MyTable')  where column like 'parameter_%';

此查询的输出将存储在 grafana 中的

$column_list
变量中,并且应该是与模式匹配的以逗号分隔的列列表。

现在在仪表板图表的 SQL 中,您只需输入如下查询:

SELECT $column_list FROM MyTable;

或者您可以与更复杂的东西结合使用,例如:

SELECT ts time, $column_list FROM MyTable WHERE $__timeFilter(ts);

您要使用的任何查询,只需添加 $column_list 变量,它会在发送到 QuestDB 之前将其替换为文字列列表。

向 QuestDB 发送两个查询

如果您要在没有 Grafana 的情况下执行此操作,那么您可以应用与我们刚刚看到的类似的解决方案。你首先需要发出一个查询来获取column_list,然后你需要编写SQL客户端插入column_list并将其发送到QuestDB。

或者对于简单的查询(否则连接和引号可能会变得棘手),您可以直接使用 QuestDB 来组合/插入列列表并获取需要发送到 QuestDB 的最终 SQL,如下所示:

with col_names AS (
select string_agg(`column`, ',') as cols from table_columns('MyTable')  where column like 'parameter_%'
)
SELECT concat('SELECT ', cols, ' FROM MyTable WHERE ts in yesterday()') FROM col_names;

此查询的结果将是包含列名称的 SQL 语句,您现在可以在 QuestDB 上执行它。

© www.soinside.com 2019 - 2024. All rights reserved.