在postgres中查找varchar列更新中的值差异

时间:2014-07-02 10:54:58

标签: sql postgresql

我们如何才能找到更新列值的差异,例如,如果我们有一个名为path的列,并且它具有值' / home / rafiq / Desktop',现在如果路径更新为&#39 ; / home / user / Desktop',我只需要获得用户'作为差异值。如果有任何函数或任何逻辑可以获得OLD和NEW值中的差异字符串,请提供帮助。

更新前的路径列

path
/home/user/Desktop

更新后的路径列

path
/home/admin/vm/Desktop

这里我需要得到' admin / vm'要使用触发器更新行中的其他列值,我们将不胜感激。

可以改变什么:

  1. / home和/ Desktop是任何路径的开头和结尾,因此只有两者之间的路径可以改变。即使有更常见的文件夹,也只应报告OLD和NEW路径的差异。如果我们更新' / home / A / B /桌面'与' / home / A / C /桌面'只有' C'应该报告。
  2. 我只关心/改变之间的整个部分。即如果/ home / admin / blah改为/ home / administration / blah,输出应该是' administration' 我正在使用postgres 9.3希望现在很清楚。

1 个答案:

答案 0 :(得分:0)

尝试这样:希望它有用

CREATE OR REPLACE FUNCTION fn_trg_t()
  RETURNS trigger AS
$BODY$ 

declare
 res varchar[];
 num int;
 ol record;
 ne record;
 i int=0;
 xstr text;

 begin

 for xold in select unnest(string_to_array(new.path,'/')) as gg Loop
  num=0;

  if xold.gg is not null then

  for xnew in select unnest(string_to_array(old.path,'/')) as rr loop

   if num=0 and xold.gg=xnew.rr then num=1; end if;

  end loop;

 if num=0 then
  res[i]=ol.gg;
  i=i+1;
  end if;
end if;

end loop;

 select array_to_string(res,'/') into xstr;

raise notice ' %', xstr;

 return xstr;
 end; 
 $BODY$
  LANGUAGE plpgsql VOLATILE