如何让postgresql解释子选择中的列名?

时间:2015-10-17 18:47:54

标签: sql postgresql

我在x86_64-apple-darwin14.1.0上的PostgreSQL 9.4.1中有以下查询,由Apple LLVM 6.0版(clang-600.0.54)(基于LLVM 3.5svn)编译,64位。

SELECT ( 
    SELECT string_agg(trim(cols::text, '()'), ', ') 
    FROM (
        SELECT 'dog.' || column_name 
        FROM information_schema.columns 
        WHERE table_name='dog') 
        AS cols
        ) 
FROM dog;

这会对dog表中的每一行产生以下输出一次:

dog.id, dog.created_date, dog.updated_date, dog.author_id, dog.mother_id, dog.start_date, dog.end_date, dog.session_type_id, dog.note, dog.cancelled, dog.life_phase

但问题是外部select查询没有取消引用列名并将它们解释为列名,而是将列标记为string_agg,并为dog表中的每一行吐出一次列名。

如何获得postgresql以确保外部选择正确解释生成列名的内部选择?

1 个答案:

答案 0 :(得分:0)

您正在尝试执行动态SQL。你需要一个plpgsql函数来做到这一点。例如:

create or replace function select_dogs()
returns setof dog language plpgsql as $$
declare
    list_of_columns text;
begin
    SELECT string_agg(trim(cols::text, '()'), ', ') 
    INTO list_of_columns
    FROM (
        SELECT 'dog.' || column_name 
        FROM information_schema.columns 
        WHERE table_name='dog'
        ) AS cols;
    return query execute format (
        'select %s from dog', list_of_columns);
end $$;

select * from select_dogs();

在文档中阅读更多内容:Executing Dynamic Commands