如何将变量值列表传递给 postgres dblink 函数中的 SQL 语句?

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

我有一个名为国家的多值变量。我被迫在监控情况下处理多个 postgres 数据库,因此我需要使用 dblink 来生成表别名。我如何调用下面的函数来传递 IN 子句中的国家/地区?

dblink(
 'link1',
 'select * from table where country_id in (' || ${countries} || ')'
) as (
  col1 text,
 col2 text etc...
)

变量提前传递并导致

dblink(
 'link1',
 'select * from table where country_id in (' || 'IN','CN' || ')'
) as (
  col1 text,
 col2 text etc...
)

这会导致

dblink(
 'link1',
 'select * from table where country_id in (IN',
 'CN)'
) as (
  col1 text,
 col2 text etc...
)

这基本上是传递给 dblink() 的参数数量错误,更重要的是,这是一个无意义的查询。我无法找到一种将变量值包装在一组引号中的方法..这样 dblink 就不会解析逗号。

有什么建议吗?

我尝试使用替换函数来转义单引号。尝试使用 grafana join() 函数将国家/地区与“”、“等连接。所有建议均来自 chatgpt。

postgresql grafana dblink grafana-variable
1个回答
0
投票

要正确地将变量值列表传递到 PostgreSQL

dblink
函数中的 SQL 语句,尤其是对于
IN
子句,您需要正确设置查询字符串的格式以处理值列表。这里的挑战是确保将国家/地区列表正确解释为
dblink
函数的单个参数,并且在 SQL 查询中正确引用和分隔每个国家/地区值。

根据您的场景,您似乎正在收到国家/地区代码列表(如

'IN', 'CN'
),并且您想要构建一个最终看起来像这样的查询:

select * from table where country_id in ('IN', 'CN')

这是实现此目的的方法:

  1. 格式化国家/地区列表:您需要将国家/地区列表转换为适合 SQL

    IN
    子句的格式。这通常涉及将每个国家/地区代码括在单引号中并用逗号分隔。

  2. 构造查询字符串:应仔细连接查询字符串以确保保持正确的格式。

  3. 将查询传递给

    dblink
    函数:最后,将构造的查询字符串传递给
    dblink
    函数。

鉴于您已尝试使用各种函数来连接和引用国家/地区值,我将说明在 PostgreSQL 中使用字符串操作和数组函数的不同方法。

示例:

-- Assume ${countries} is a comma-separated list like 'IN,CN'
-- We convert it into an array, then transform each element, and finally concatenate them back into a string.

SELECT dblink(
  'link1',
  'SELECT * FROM table WHERE country_id IN (' || 
  array_to_string(
    array_agg('''' || unnest(string_to_array(${countries}, ',')) || ''''),
    ','
  ) || ')'
) AS (
  col1 text,
  col2 text,
  -- etc...
);
© www.soinside.com 2019 - 2024. All rights reserved.