仅在列存在时才执行更新

时间:2015-05-08 19:08:58

标签: postgresql sql-update dynamic-sql

如果列存在,是否可以有条件地执行更新? 例如,我可能在表中有一列,如果该列存在,我希望执行更新,否则,只需跳过它(或捕获它的异常)。

2 个答案:

答案 0 :(得分:0)

你可以在一个功能中完成。如果您以后不想使用该功能,可以在之后删除它。

要知道某个列中是否存在某个列,您可以尝试使用select {(或者,如果您要放弃该结果,请执行此操作)在information_schema.columns中获取该列。

下面的查询创建一个函数,用于在表 foo 中搜索列 bar ,如果找到它,则更新其值。之后该功能运行,然后下降。

create function conditional_update() returns void as
$$
begin
  perform column_name from information_schema.columns where table_name= 'foo' and column_name = 'bar';
  if found then
    update foo set bar = 12345;
  end if;
end;
$$ language plpgsql;
select conditional_update();
drop function conditional_update();

答案 1 :(得分:0)

以下表为例:

CREATE TABLE mytable (
    idx INT
    ,idy INT
    );

insert into mytable values (1,2),(3,4),(5,6);

您可以创建如下所示的自定义功能进行更新:

create or replace function fn_upd_if_col_exists(_col text,_tbl text,_val int) returns void as 
$$
begin
If exists (select 1 
from information_schema.columns  
where table_schema='public' and table_name=''||_tbl||'' and column_name=''||_col||'' ) then
execute format('update mytable set '||_col||'='||_val||'');
raise notice 'updated';
else
raise notice 'column %s doesn''t exists on table %s',_col,_tbl;
end if;
end;
$$
language plpgsql

您可以将此功能称为:

select fn_upd_if_col_exists1('idz','mytable',111) -- won't update raise "NOTICE:  column idz deosnt exists on table mytables"

select fn_upd_if_col_exists1('idx','mytable',111) --will upadate column idx with value 1111 "NOTICE:  updated"