postgresql – 循环并从多个表中选择数据的函数

postgresql – 循环并从多个表中选择数据的函数,第1张

概述我是Postgres的新手,拥有一个具有相同结构的多个表的数据库.我需要从每个表中选择符合特定条件的数据. 我可以用一堆UNION查询做到这一点,但是我需要搜索的表的数量会随着时间的推移而改变,所以我不想像那样硬编码.我一直在尝试开发一个循环遍历特定表的函数(它们有一个共同的命名约定)并返回一个记录表,但是当我查询函数时,我没有得到任何结果.功能代码如下: CREATE OR REPLACE FU 我是Postgres的新手,拥有一个具有相同结构的多个表的数据库.我需要从每个表中选择符合特定条件的数据.

我可以用一堆UNION查询做到这一点,但是我需要搜索的表的数量会随着时间的推移而改变,所以我不想像那样硬编码.我一直在尝试开发一个循环遍历特定表的函数(它们有一个共同的命名约定)并返回一个记录表,但是当我查询函数时,我没有得到任何结果.功能代码如下:

CREATE OR REPLACE FUNCTION public.internalID_formaltable_name_lookup()  RETURNS table(natural_ID text,name text,natural_ID_numeric text) AS$BODY$DECLARE    formal_table text;begin  FOR formal_table IN    select table_name from information_schema.tables    where table_schema = 'public' and table_name like 'formaltable%'  LOOP    EXECUTE 'SELECT natural_ID,name,natural_ID_numeric             FROM ' || formal_table ||            ' WHERE natural_ID_numeric IN (                select natural_ID_numeric from internal_IDlookup                where internal_ID = ''7166571'')';    RETURN NEXT; END LOOP; Return;END;$BODY$  LANGUAGE plpgsql;

我尝试使用该函数时没有收到任何错误,但它没有返回任何行:

SELECT * From internalID_formaltable_name_lookup();

知道我哪里错了吗?

CREATE OR REPLACE FUNCTION public.internalID_formaltable_name_lookup()  RETURNS table(natural_ID text,natural_ID_numeric text) AS$func$DECLARE   formal_table text;BEGIN   FOR formal_table IN      SELECT quote_IDent(table_name)      FROM   information_schema.tables      WHERE  table_schema = 'public'      AND    table_name liKE 'formaltable%'   LOOP      RETURN query EXECUTE      'SELECT t.natural_ID,t.name,t.natural_ID_numeric       FROM   internal_IDlookup i        JOIN   public.' || formal_table || ' t USING (natural_ID_numeric)       WHERE  i.internal_ID = 7166571';   -- assuming internal_ID is numeric   END LOOP;END$func$ LANGUAGE plpgsql;

主要观点:

>您必须使用RETURN QUERY EXECUTE返回每组行.
EXECUTE,然后是RETURN NEXT,并不能完成您的预期.
>您需要清理标识符.我在这里使用quote_IDent().或者您的查询将破坏非标准标识符并允许sql注入!
>将col IN(子选择)转换为更高效的JOIN.
>这与使用一堆UNION查询略有不同.它不会删除重复的行,实际上就像UNION ALL一样.

就个人而言,我宁愿在系统目录pg_class上构建它.细节:

> How to check if a table exists in a given schema

然后,您可以使用pg_class.oID :: regclass自动转义和模式化表名.细节:

> Table name as a PostgreSQL function parameter
> Search across multiple tables and also display table name in resulting rows

但这取决于您的要求和品味的细节.

总结

以上是内存溢出为你收集整理的postgresql – 循环并从多个表中选择数据的函数全部内容,希望文章能够帮你解决postgresql – 循环并从多个表中选择数据的函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1181736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存