Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在postgres中的varchar列更新中查找值差异_Sql_Postgresql - Fatal编程技术网

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

Sql 在postgres中的varchar列更新中查找值差异,sql,postgresql,Sql,Postgresql,例如,如果我们有一个名为path的列,它的值为“/home/rafiq/Desktop”,那么如何才能找到更新列值的差异呢?现在,如果path更新为“/home/user/Desktop”,我只需要将“user”作为差异值。如果有任何函数或逻辑仅获取新旧值中的差异字符串,请提供帮助 更新前的路径列 path /home/user/Desktop 更新后的路径列 path /home/admin/vm/Desktop 在这里,我需要让'admin/vm'使用触发器更新行中的其他列值,任何帮助都

例如,如果我们有一个名为path的列,它的值为“/home/rafiq/Desktop”,那么如何才能找到更新列值的差异呢?现在,如果path更新为“/home/user/Desktop”,我只需要将“user”作为差异值。如果有任何函数或逻辑仅获取新旧值中的差异字符串,请提供帮助

更新前的路径列

path
/home/user/Desktop
更新后的路径列

path
/home/admin/vm/Desktop
在这里,我需要让'admin/vm'使用触发器更新行中的其他列值,任何帮助都将不胜感激

什么可以改变:

/home和/桌面是任何路径的起点和终点,因此只有中间的路径可以更改。即使有更多公用文件夹,也只应报告新旧路径的差异。如果我们将“/home/A/B/Desktop”更新为“/home/A/C/Desktop”,则只应报告“C”。 我只关心中间/变化的整个部分。i、 e.如果/home/admin/blah更改为/home/administration/blah,则输出应为“administration” 我使用的是Postgres9.3,希望这是清楚的。
试着这样做:希望对你有帮助

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

这不是一个容易的问题,甚至没有很好的定义。例如,如果之前有/home/animal/Desktop和/home/admin/Desktop,您希望得到什么输出?是基于角色位置的差异看起来不是这样还是其他?基于共同的开头和结尾的差异没有固定,但是,“/home/”和“/Desktop”在您的案例中,输出应该是“admin”,希望这很清楚在这种情况下,您应该编写自定义比较函数是的,我只是需要帮助,从那些可能尝试过类似方法的人那里寻找线索实际上,你的定义一点也不清楚。在任何人开始编写函数之前,定义应该非常清楚。什么可以改变?在每种情况下应该报告什么?如果难以描述,请添加一个可能的案例列表。还添加了使用tblin psql和您的Postgres版本获得的表定义。