2010-04-20 11 views
6

Ich habe eine PostgreSQL 8.4-Tabelle mit einer automatisch inkrementieren, aber Nullable, Integer-Spalte. Ich möchte einige Spaltenwerte aktualisieren, und wenn diese Spalte NULL ist, dann setze sie auf ihren Standardwert (was eine Ganzzahl wäre, automatisch aus einer Sequenz generiert), , aber Ich möchte seinen Wert in jedem Fall zurückgeben. Deshalb möchte ich etwas wie folgt aus:Bedingte eine Spalte auf den Standardwert in Postgres

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

Leider funktioniert das nicht - es scheint, dass DEFAULT besondere ist und nicht Teil eines Ausdrucks sein. Was ist der beste Weg, dies zu tun?

+0

Es klingt, als ob Sie den Zweck der Spalte incident_id überladen und einige Geschäftslogik hier einbetten. KUSS. – Timothy

+0

Kandidat für Feature-Anfrage? – adjenks

Antwort

4

Verwendung dieses:

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

wenn Ihr incidentid Integer-Typ ist, lege eine Typumwandlung auf 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'; 

zu verwenden:

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

Tut mir leid, das funktioniert nicht. 'column_default' gibt" nextval (('intervents_s' :: text) :: regclass) "zurück - nicht der Wert dieses Ausdrucks, was ich möchte. – EMP

+2

Woah, das ist eine Menge Code. Klingt wie es ist am besten, den Standardausdruck in meiner Abfrage zu kopieren. +1 sowieso. – EMP

+0

Es ist eine Schönheit! Der Schemaname könnte auch eine Variable sein, die den Standard 'public' verwendet. –

Verwandte Themen