2014-07-02 26 views
0

我们如何才能找到更新的列值的差异,例如,如果我们有一个名为path的列,并且它的值为'/ home/rafiq/Desktop',现在如果更新了路径到'/ home/user/Desktop',我只需要获得'user'作为差异值。如果有任何函数或任何逻辑来获取OLD和NEW值中的差异字符串,请帮助。更新前查找postgres中varchar列更新的值差异

路径栏更新后

path 
/home/user/Desktop 

路径列

path 
/home/admin/vm/Desktop 

在这里,我需要得到“管理/ VM”使用触发器来更新该行中的其他列的值,任何帮助将不胜感激。

什么可以改变:

  1. /home和/桌面是开始和之间的任何路径,唯一路径结束可以改变。即使有更多的常用文件夹,也应报告OLD和NEW路径的差异。如果我们用'/ home/A/C/Desktop'更新'/ home/A/B/Desktop',则只应报告'C'。
  2. 我只关心/改变之间的整个部分。即如果/ home/admin/blah更改为/ home/administration/blah,则输出应为'administration' 我正在使用postgres 9.3希望现在已经清楚。
+2

这不是一个简单的问题,甚至没有明确界定。例如,如果你之前拥有'/ home/animal/Desktop'和'/ home/admin/Desktop',你期望输出什么?基于角色位置的差异(似乎不那么)还是其他? –

+0

基于共同的开始和结局(虽然不固定)的差异,'/ home /'和'/ Desktop'在你的情况下,输出应该是'admin',希望在这种情况下清除 – RAFIQ

+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