2016-09-19 50 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) ...