2016-09-19 64 views
0

如何在不使用数据类型的情况下获取默认列值?Postgres获得列的默认实际值(不包括数据类型)

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

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

然后创建一个表:

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

当无论是通过INFORMATION_SCHEMA或PG_ queering列默认*我得到的响应,由值组成的文本和它的类型连接起来:

# 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) 

我需要它来ret瓮一个,而不是“A” ::牛逼,正是因为我得到读取枚举值时:

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

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

回答

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) ...