比如字段a='101,102,103';b='103,104,105';
进行判断a和b是否有相同值;
1.先写一个分割逗号函数,如下(V_STR需要分割的字符串,V_SPLITER是以什么方式分割如','等):
function splitString(v_str in varchar2, v_spliter in varchar2) return type_str_split pipelined is j int := 0; i int := 1; len int := 0; len1 int := 0; str varchar2(4000); begin len := length(v_str); len1 := length(v_spliter); while j < len loop j := instr(v_str, v_spliter, i); if j = 0 then j := len; str := substr(v_str, i); pipe row(str); if i >= len then exit; end if; else str := substr(v_str, i, j - i); i := j + len1; pipe row(str); end if; end loop; return; end;
注:关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该集合的单个元
素,函数以一个空的RETURN 语句结束,以表明它已经完成。
2.写一个比较函数,调用刚刚的分割函数,对字符串进行比较:
--返回:0 => vStr2以','分割的某个字符不存在于vStr1,返回:1 => 则存在
function compareString(vStr1 varchar2, --被比较的字符串(eg:101,102,103) vStr2 varchar2 --比较的字符串(eg:103,104,105) ) return number is mResult number; begin mResult := 0; for cur in (select * from table(splitStr(vStr2, ','))) loop if instr(',' || vStr1 || ',', ',' || cur.column_value || ',') > 0 then mResult := 1; return mResult; end if; end loop; return mResult; end;
3.结果如图