免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1716 | 回复: 0
打印 上一主题 下一主题

pg存储过程 字符串转数组后交叉比对 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:53 |只看该作者 |倒序浏览
最近因工作需要,碰到一个临时对帐的需求,有两列数据,数据中包含以空格分隔的客户名称字符串,
比对要求:只要字符串中有一个客户名称在另一列中存在即为真,否则返回否;当两列数据生成数组元素只有一个时,数据只要被相互包含,则返回真。
例1:
数据列一"AAA BBB CCC",数据列二"DDD CCC EEE",返回真
例2:
数据列一"AAA BBB CCC",数据列二"DDD EEE FFF",返回否
例3:
数据列一"AA",数据列二"BBBAABBB",返回真
想在数据库查询中直接返回结果,所以在postgresql中通过PL实现
 
  1. -- Function: mydiff(character varying, character varying)

  2. -- DROP FUNCTION mydiff(character varying, character varying);

  3. CREATE OR REPLACE FUNCTION mydiff(character varying, character varying)
  4.   RETURNS boolean AS
  5. $BODY$
  6. declare
  7. sz1 alias for $1;
  8. sz2 alias for $2;

  9. bdjg boolean;
  10. sza character varying[];
  11. szb character varying[];
  12. max integer;
  13. begin
  14.    sz1:=trim(sz1);
  15.    sz2:=trim(sz2);
  16.    IF length(sz1)<1 then
  17.        return false;
  18.    else
  19.        if length(sz2)<1 then
  20.            return false;
  21.        else
  22.            sza:=regexp_split_to_array(sz1,E'\\s+');
  23.            szb:=regexp_split_to_array(sz2,E'\\s+');
  24.            bdjg:=false;
  25.            
  26.            if array_upper(sza,1)>array_upper(szb,1) then
  27.               for i in 1..ARRAY_upper(szb,1) LOOP
  28.                   bdjg:=(szb[i]=any(sza));
  29.                   if bdjg then
  30.                      EXIT;
  31.                   end if;
  32.               end loop;
  33.            else
  34.               for i in 1..ARRAY_upper(sza,1) LOOP
  35.                 bdjg:=(sza[i]=any(szb));
  36.                 if bdjg then
  37.                    EXIT;
  38.                 end if;
  39.               end loop;
  40.            end if;

  41.            if array_upper(sza,1)=1 and array_upper(szb,1)=1 then
  42.               if position(sza[1] in szb[1])>0 or position(szb[1] in sza[1])>0 then
  43.                  bdjg:=true;
  44.               end if;
  45.            end if;
  46.            
  47.           return bdjg;
  48.        end if;

  49.    end if;
  50. end;
  51. $BODY$
  52.   LANGUAGE plpgsql VOLATILE
  53.   COST 100;
  54. ALTER FUNCTION mydiff(character varying, character varying) OWNER TO postgres;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP