postgresql 如何执行带有串接表名的SQL代码?

rsl1atfo  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(168)

下面是我尝试做的一个例子:

SELECT  count(*) as "count" 
FROM (
   SELECT overlay('db_xx.company_summary' placing 'US' from 4)
) as s

这将返回count为1,而表db_us.company_summary中有许多行。
我希望它计算所有行,类似于以下查询:

SELECT count(*) as "count" 
FROM   db_us.company_summary

我尝试了覆盖函数,类似于上面的查询。我不确定是否有可能在SQL中做到这一点。
在Python中,你可以这样做:

"hello {}".format("world")

因此,我希望输入字符串充当SQL语法命令。

00jrzges

00jrzges1#

普通SQL不允许参数化标识符(或除值之外的任何内容)。您需要动态SQL。示例:

  • 截断Postgres数据库中的所有表
  • 如何在plpgsql中使用变量作为表名
  • 如何在postgresql函数中使用变量进行循环查询

使用动态SQL的PL/pgSQL函数示例:

CREATE OR REPLACE FUNCTION f_counts()
  RETURNS SETOF bigint
  LANGUAGE plpgsql AS
$func$
DECLARE
   _lower_iso2 text;
   _ct bigint;
BEGIN
   FOR _lower_iso2 IN
      SELECT lower(iso2) FROM country_code
   LOOP
      RETURN QUERY EXECUTE
      format ('SELECT count(*) AS count FROM %I.company_summary'
            , overlay('db_xx' PLACING _lower_iso2 FROM 4)
             );
   END LOOP;
END
$func$;

电话:

SELECT * FROM f_counts();

结果:

f_counts
---------
2
3
4
  • db〈〉小提琴here *

请注意,Postgres标识符区分大小写:

  • PostgreSQL列名是否区分大小写?

相关问题