Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1354190
  • 博文数量: 334
  • 博客积分: 10302
  • 博客等级: 上将
  • 技术积分: 2986
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 10:17
文章分类

全部博文(334)

文章存档

2013年(1)

2012年(9)

2011年(4)

2010年(10)

2009年(24)

2008年(64)

2007年(72)

2006年(150)

我的朋友

分类: Mysql/postgreSQL

2011-07-26 10:56:34

最近因工作需要,碰到一个临时对帐的需求,有两列数据,数据中包含以空格分隔的客户名称字符串,
比对要求:只要字符串中有一个客户名称在另一列中存在即为真,否则返回否;当两列数据生成数组元素只有一个时,数据只要被相互包含,则返回真。
例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;
阅读(2621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~