最近因工作需要,碰到一个临时对帐的需求,有两列数据,数据中包含以空格分隔的客户名称字符串,
比对要求:只要字符串中有一个客户名称在另一列中存在即为真,否则返回否;当两列数据生成数组元素只有一个时,数据只要被相互包含,则返回真。
例1:
数据列一"AAA BBB CCC",数据列二"DDD CCC EEE",返回真
例2:
数据列一"AAA BBB CCC",数据列二"DDD EEE FFF",返回否
例3:
数据列一"AA",数据列二"BBBAABBB",返回真
想在数据库查询中直接返回结果,所以在postgresql中通过PL实现
- -- Function: mydiff(character varying, character varying)
- -- DROP FUNCTION mydiff(character varying, character varying);
- CREATE OR REPLACE FUNCTION mydiff(character varying, character varying)
- RETURNS boolean AS
- $BODY$
- declare
- sz1 alias for $1;
- sz2 alias for $2;
- bdjg boolean;
- sza character varying[];
- szb character varying[];
- max integer;
- begin
- sz1:=trim(sz1);
- sz2:=trim(sz2);
- IF length(sz1)<1 then
- return false;
- else
- if length(sz2)<1 then
- return false;
- else
- sza:=regexp_split_to_array(sz1,E'\\s+');
- szb:=regexp_split_to_array(sz2,E'\\s+');
- bdjg:=false;
-
- if array_upper(sza,1)>array_upper(szb,1) then
- for i in 1..ARRAY_upper(szb,1) LOOP
- bdjg:=(szb[i]=any(sza));
- if bdjg then
- EXIT;
- end if;
- end loop;
- else
- for i in 1..ARRAY_upper(sza,1) LOOP
- bdjg:=(sza[i]=any(szb));
- if bdjg then
- EXIT;
- end if;
- end loop;
- end if;
- if array_upper(sza,1)=1 and array_upper(szb,1)=1 then
- if position(sza[1] in szb[1])>0 or position(szb[1] in sza[1])>0 then
- bdjg:=true;
- end if;
- end if;
-
- return bdjg;
- end if;
- end if;
- end;
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100;
- ALTER FUNCTION mydiff(character varying, character varying) OWNER TO postgres;
阅读(2621) | 评论(0) | 转发(0) |