从包含名称的列的架构内的所有表中选择

时间:2019-04-02 08:49:19

标签: sql postgresql plpgsql

如何获得选择(table_name,table_name.age)? 我需要从所有具有此列/

的表的“年龄”列中获取值

我有这个功能

cg1.RegisterGoods("c++", 23, 32);

1 个答案:

答案 0 :(得分:1)

您不需要生成单个巨大的UNION语句。如果使用RETURN QUERY,则每次使用时,该查询的结果都会附加到该函数的总体结果中。

处理动态SQL时,还应该使用format()来正确处理标识符。

您的功能可以简化为:

CREATE OR REPLACE FUNCTION union_all_tables()
 RETURNS TABLE (table_schema text, table_name text, age bigint) 
AS
$$
DECLARE
 dynamic_query text = '';
 r_row         record;
BEGIN
  FOR r_row IN SELECT c.table_schema, c.table_name
               FROM information_schema.columns c
               WHERE c.column_name = 'age' 
  LOOP
    dynamic_query := format(
                      'select %L as table_schema, %L as table_name, age from %I.%I', 
                           r_row.table_schema, r_row.table_name, 
                           r_row.table_schema, r_row.table_name);
    RETURN QUERY EXECUTE dynamic_query;
  END LOOP;
END;
$$
LANGUAGE plpgsql;

请注意,如果存在(至少)一个age列不是bigint的表,则整个功能将失败。