2010-12-02 33 views
1

优秀answer由亚历山大GUIDET后,我试图运行下面的查询:使用查询设置列式中的PostgreSQL

create table egg (id (SELECT 
    pg_catalog.format_type(a.atttypid, a.atttypmod) as Datatype 
    FROM 
    pg_catalog.pg_attribute a 
    WHERE 
    a.attnum > 0 
    AND NOT a.attisdropped 
    AND a.attrelid = ( 
    SELECT c.oid 
    FROM pg_catalog.pg_class c 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
    WHERE c.relname ~ '^(TABLENAME)$' 
    AND pg_catalog.pg_table_is_visible(c.oid) 
) 
    and a.attname = 'COLUMNNAME')); 

PostgreSQL的,然而,抱怨不正确的语法。具体来说它说我不能写:create table egg (id (SELECT
是否有任何解决方法?我无法将查询结果转换为文本并将其重新用作查询吗?

回答

3

有一个简单很多方式来做到这一点。

SELECT pg_typeof(col)::text FROM tbl LIMIT 1 

只有前提是模板表保存至少一行。看到manual on pg_typeof()

正如Milen写道,你需要动态DDL语句这样的EXECUTE
一个更简单的DO声明:

DO $$BEGIN 
EXECUTE 'CREATE TABLE egg (id ' 
     || (SELECT pg_typeof(col)::text FROM tbl LIMIT 1) || ')'; 
END$$; 

或者,如果你不知道该模板表有任何行:

DO $$BEGIN 
EXECUTE (
    SELECT format('CREATE TABLE egg (id %s)' 
       , format_type(atttypid, atttypmod)) 
    FROM pg_catalog.pg_attribute 
    WHERE attrelid = 'tbl'::regclass -- name of template table 
    AND attname = 'col'    -- name of template column 
    AND attnum > 0 AND NOT attisdropped 
    ); 
END$$; 

这些条件似乎是多余的,因为你寻找一个特定的列任何

format()需要Postgres 9.1+。

相关:

1

您可以在查询转换为function或者(如果你有Postgres的9.0),以an anonymous code block

DO $$DECLARE the_type text; 
BEGIN 
    SELECT ... AS datatype INTO the_type FROM <the rest of your query>; 
    EXECUTE 'create table egg (id ' || the_type || <the rest of your create table statement>; 
END$$; 
0

您可以有一个表定义或查询,但不能同时使用。也许你想到select into命令。