代码之家  ›  专栏  ›  技术社区  ›  EMP

在Postgres中将列有条件地设置为其默认值

  •  6
  • EMP  · 技术社区  · 14 年前

    我有一个PostgreSQL 8.4表,它有一个自动递增但可为空的整数列。我想更新一些列值,如果这个列为NULL,那么将其设置为默认值(这将是一个由序列自动生成的整数), 但是 无论哪种情况,我都想返回它的值。所以我想要这样的东西:

    UPDATE mytable
    SET incident_id = COALESCE(incident_id, DEFAULT), other = 'somethingelse'
    WHERE ...
    RETURNING incident_id
    

    不幸的是,这不起作用——似乎 DEFAULT 是特殊的,不能作为表达式的一部分。最好的方法是什么?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Michael Buen    14 年前

    使用这个:

    update mytable set a = 
        coalesce(incidentid, 
        (
         select column_default::int 
         from information_schema.columns 
         where table_schema = 'public' 
         and table_name = 'mytable' and column_name = 'incidentid')
        )
    

    如果您的incidentid是整数类型,请在默认列上放置类型转换

    [编辑]

    create or replace function get_default_value(_table_name text,_column_name text) 
    returns text
    as
    $$
    declare r record;
    s text;
    begin
    
        s = 'SELECT ' || coalesce(
    
        (select column_default 
        from information_schema.columns 
        where table_schema = 'public' 
        and table_name = _table_name and column_name = _column_name)
    
        , 'NULL') || ' as v';
    
        EXECUTE s into r;
        return r.v;
    end;
    $$
    language 'plpgsql';
    

    使用:

    update mytable set a = 
        coalesce(incidentid, get_default_value('mytable','a')::int )