У меня есть таблица PostgreSQL 8.4 с автопостепенным увеличением, но nullable, целочисленный столбец. Я хочу обновить некоторые значения столбцов и, если бы этот столбец является ПУСТЫМ, затем устанавливает его на его значение по умолчанию (который был бы целым числом, автоматически сгенерированным от последовательности), но я хочу возвратить ее значение в любом случае. Таким образом, я хочу что-то вроде этого:
UPDATE mytable
SET incident_id = COALESCE(incident_id, DEFAULT), other = 'somethingelse'
WHERE ...
RETURNING incident_id
К сожалению, это не работает - это кажется этим DEFAULT
является особенным и не может быть часть выражения. Что лучший способ состоит в том, чтобы сделать это?
используйте это:
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 является целочисленным типом, поместите приведение типа в column_default
[РЕДАКТИРОВАТЬ]
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 )