QuestDB 是否可以根据列名本身选择一系列列?
例如,我有大量且数量可变的列,其名称为
parameter_X
(parameter_1
、parameter_2
...)。我希望能够选择与此前缀匹配的所有列,因为它们的数量很大(1000+)且数量不确定。理想情况下,我能够做这样的事情:
SELECT "parameter_*" from MyTable;
我查看了 QuestDB 文档中的正则表达式和表元数据。看起来不可能在
SELECT
子句中使用正则表达式(仅在 WHERE
子句中)。我也无法从 table_columns('MyTable')
执行复合查询,其中结果可以用作 SELECT
子句中的列名称。我已经查看了 QuestDB 中元函数的页面,但无法为这个问题提供可行的解决方案。
有人知道这是否可能吗?我在 Grafana 中创建此查询,因此我可以使用 SQL,但无法轻松地以编程方式操作中间结果。
有两种选择可以执行此操作:一种涉及 Grafana(因为您已经在使用它),另一种向 QuestDB 发送两个单独的查询。
在 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 之前将其替换为文字列列表。
如果您要在没有 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 上执行它。