Postgresql 从许多postgres表中全选
我们有大约40个表,所有表都有相似但不完全相同的字段。每个表都创建了_by和_at字段 我们试图查询一组特定的表,并仅返回创建的_by='john'行中创建的_at字段 到目前为止,我们已经 从结果表中选择已创建的 在哪里 从information_schema.tables中选择table_name 哪里 并创建了_by='john' 内部查询独立工作,并列出正确的表。 我们希望从内部查询中的所有表中创建外部查询 因此,从下表中可以看出:Postgresql 从许多postgres表中全选,postgresql,Postgresql,我们有大约40个表,所有表都有相似但不完全相同的字段。每个表都创建了_by和_at字段 我们试图查询一组特定的表,并仅返回创建的_by='john'行中创建的_at字段 到目前为止,我们已经 从结果表中选择已创建的 在哪里 从information_schema.tables中选择table_name 哪里 并创建了_by='john' 内部查询独立工作,并列出正确的表。 我们希望从内部查询中的所有表中创建外部查询 因此,从下表中可以看出: table1 created_by created
table1
created_by created_at val
john 12:00 5
sue 13:20 7
table20
created_by created_at val
john 21:30 3
jane 23:45 21
我们将得到:
12:00
21:30
您可以创建一个访问所有表的函数:
CREATE OR REPLACE FUNCTION some_schema.some_function_name()
returns TABLE(created_by varchar(300), created_at varchar(300))
AS $BODY$
DECLARE
stmt text;
BEGIN
stmt = (
WITH relevant_tables AS (
SELECT table_name,
CONCAT('SELECT created_by::varchar(300), created_at::varchar(300) FROM ', table_name) as table_query
FROM information_schema.tables
WHERE <some criteria to limit tables being searched>
)
SELECT string_agg(table_query, ' UNION ALL ') AS final_query
FROM relevant_tables a
);
return query EXECUTE stmt;
end; $BODY$
language plpgsql
;
您还可以在喜欢的地方添加任何内容。您需要编写一个使用动态SQL的函数
SELECT * FROM some_schema.some_function_name()
do $$
DECLARE
i record;
xcreated_at text;
BEGIN
FOR i in select table_name from information_schema.tables LOOP
EXECUTE('select created_at from '||i.table_name||' where created_by = ''John''')INTO xcreated_at;
raise notice 'xcreated_at%',xcreated_at;
END LOOP;
END;
$$ ;