2010-04-20 28 views
6

Tengo una tabla de PostgreSQL 8.4 con una columna entera de incremento automático pero con nulos. Quiero actualizar algunos valores de columna y, si esta columna es NULL, configúrelo con su valor predeterminado (que sería un número entero generado automáticamente a partir de una secuencia), pero Quiero devolver su valor en ambos casos. Así que quiero algo como esto:Configurar condicionalmente una columna a su valor predeterminado en Postgres

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

Por desgracia, esto no funciona - parece que DEFAULT es especial y no puede ser parte de una expresión. ¿Cuál es la mejor manera de hacer esto?

+0

Parece que está sobrecargando el propósito de la columna incident_id e incorporando alguna lógica comercial aquí. BESO. – Timothy

+0

¿Candidato para solicitud de función? – adjenks

Respuesta

4

uso esto:

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

si su incidentid es de tipo entero, poner un encasillado en column_default

[EDIT]

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'; 

de usar:

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

Lo siento, eso no funciona. 'column_default' devuelve" nextval (('incidents_s' :: text) :: regclass) "- no el valor de esa expresión, que es lo que quiero. – EMP

+2

Woah, eso es mucho código. Parece que es mejor duplicar la expresión predeterminada en mi consulta. +1, de todos modos. – EMP

+0

¡Es una belleza! El schemaname también podría ser una variable, utilizando el valor predeterminado 'public'. –

Cuestiones relacionadas