如何获得选择(table_name,table_name.age)? 我需要从所有具有此列/
的表的“年龄”列中获取值我有这个功能
cg1.RegisterGoods("c++", 23, 32);
答案 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
的表,则整个功能将失败。