PostgreSQL中如何用单个查询实现从表A获取列名并查询表B数据
合并PostgreSQL查询实现动态列选择
要把获取列列表和查询表B这两步合并成单个PostgreSQL查询,需要用到动态SQL,通过字符串拼接生成查询语句并执行。具体实现如下:
DO $$ DECLARE col_list text; BEGIN -- 从表A的列B中获取所有列名,拼接成逗号分隔的字符串 SELECT string_agg(quote_ident("列B"), ', ') INTO col_list FROM "表A"; -- 执行动态生成的查询 EXECUTE format('SELECT %s FROM "表B"', col_list); END $$;
说明
string_agg(quote_ident("列B"), ', '):把表A列B中的每个值用quote_ident处理(避免列名包含特殊字符或关键字导致语法错误),再拼接成逗号分隔的列名字符串。EXECUTE format(...):用format函数安全构造查询语句,然后执行动态SQL。
如果需要将查询结果直接返回(而非仅在PL/pgSQL块中执行),可以创建函数实现:
CREATE OR REPLACE FUNCTION get_dynamic_columns() RETURNS SETOF record AS $$ DECLARE col_list text; BEGIN SELECT string_agg(quote_ident("列B"), ', ') INTO col_list FROM "表A"; RETURN QUERY EXECUTE format('SELECT %s FROM "表B"', col_list); END $$ LANGUAGE plpgsql; -- 调用时需指定返回结构 SELECT * FROM get_dynamic_columns() AS ("Col_name 1" text, "Col_name 2" text);
内容的提问来源于stack exchange,提问作者Vishnu Cealian
相关产品推荐
相关产品推荐

