我在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以确保外部选择正确解释生成列名的内部选择?
答案 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。