2010-04-20 15 views
6

Mam tabelę PostgreSQL 8.4 z automatycznie zwiększającą się, ale zerową kolumną całkowitą. Chcę zaktualizować niektóre wartości kolumn, a jeśli ta kolumna ma wartość NULL, ustaw ją na wartość domyślną (która byłaby liczbą całkowitą wygenerowaną automatycznie z sekwencji), , ale Chcę zwrócić wartość w obu przypadkach. Więc chcę coś takiego:Warunkowo ustaw kolumnę na wartość domyślną w Postgresie

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

Niestety, to nie działa - wydaje się, że DEFAULT jest wyjątkowy i nie mogą być częścią wypowiedzi. Jaki jest najlepszy sposób na zrobienie tego?

+0

Wygląda na to, że przeciążasz cel kolumny incident_id i umieszczasz tutaj pewną logikę biznesową. POCAŁUNEK. – Timothy

+0

Kandydat na żądanie funkcji? – adjenks

Odpowiedz

4

użyj:

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

jeśli incidentid jest liczbą całkowitą typu, umieścić typecast na 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'; 

używać:

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

Niestety, to nie działa. 'column_default' zwraca" nextval (('incidents_s' :: text) :: regclass) "- nie wartość tego wyrażenia, czego właśnie chcę. – EMP

+2

Woah, to dużo kodu. Wygląda na to, że najlepiej jest skopiować domyślne wyrażenie w moim zapytaniu. +1, tak czy inaczej. – EMP

+0

To piękno! Schemaname również może być zmienną, używając domyślnego "public". –

Powiązane problemy