我可以用一堆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 – 循环并从多个表中选择数据的函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)