【问题标题】:Postgres get default real value of column (without datatype)Postgres 获取列的默认实际值(无数据类型)
【发布时间】:2016-09-19 09:38:45
【问题描述】:

如何在没有数据类型的情况下仅获取默认列值。

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

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 而不是 'a'::t,就像我在读取枚举值时得到的一样:

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

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

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2010-10-03
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多