Postgres获取列的默认实际值(不带数据类型)

时间:2016-09-19 09:38:45

标签: postgresql

如果没有它的数据类型,如何才能获得默认列值。

我创建了一个新的枚举类型:

CREATE TYPE t AS ENUM ('a', 'b', 'c');

然后创建一个表格:

create table t1 (c1 t default 'a'::t);

当通过information_schema或pg_ *对列默认值进行排队时,我将响应作为由值组成的文本,并将其类型连接到它:

# SELECT column_default::text 
FROM information_schema.columns 
WHERE (table_schema, table_name, column_name)
    = ('public', 't1', 'c1');
 column_default 
----------------
 'a'::t
(1 row)

# SELECT d.adsrc AS default_value
FROM   pg_catalog.pg_attribute a
LEFT   JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)
                                     = (d.adrelid,  d.adnum)
WHERE  NOT a.attisdropped
    AND    a.attnum > 0
    AND    a.attrelid = 'public.t1'::regclass
    AND    a.attname = 'c1';
 default_value 
---------------
 'a'::t
(1 row)

我需要它返回 a 而不是' :: t ,就像我在阅读枚举值时所得到的那样:

select UNNEST(ENUM_RANGE(NULL::t));
 unnest 
--------
 a
 b
 c
(3 rows)

我知道我可以修剪/正则表达式,但是有一个纯粹的PostgreSQL解决方案吗?

1 个答案:

答案 0 :(得分:2)

我认为使用字符串操作会很好,但也许这会让你更好:

CREATE OR REPLACE FUNCTION default_to_t(arg IN text, res OUT t)
   LANGUAGE plpgsql STABLE AS
$$BEGIN
   EXECUTE 'SELECT ' || arg INTO res;
END;$$;

然后你可以

SELECT default_to_t(d.adsrc) ...
相关问题