我有一个名为国家的多值变量。我被迫在监控情况下处理多个 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
dblink
函数中的 SQL 语句,尤其是对于 IN
子句,您需要正确设置查询字符串的格式以处理值列表。这里的挑战是确保将国家/地区列表正确解释为 dblink
函数的单个参数,并且在 SQL 查询中正确引用和分隔每个国家/地区值。
根据您的场景,您似乎正在收到国家/地区代码列表(如
'IN', 'CN'
),并且您想要构建一个最终看起来像这样的查询:
select * from table where country_id in ('IN', 'CN')
这是实现此目的的方法:
格式化国家/地区列表:您需要将国家/地区列表转换为适合 SQL
IN
子句的格式。这通常涉及将每个国家/地区代码括在单引号中并用逗号分隔。
构造查询字符串:应仔细连接查询字符串以确保保持正确的格式。
将查询传递给
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...
);