oracle 取俩个字符串的差集
思路:
--funcation RemoveSameStr(in_str,splitStr) ;用于去除重复值 ; SELECT b.memberid, RemoveSameStr(wm_concat(b.productidlist),',') AS productidlist FROM BASE_ACCOUNT_BILL_GROUP b WHERE b.grouptype =3 GROUP BY b.memberid ;
2.创建 FUNCTION REMOVESAMESTR(OLDSTR VARCHAR2, SIGN VARCHAR2);
1 CREATE OR REPLACE FUNCTION REMOVESAMESTR(OLDSTR VARCHAR2, SIGN VARCHAR2) 2 RETURN VARCHAR2 IS 3 STR VARCHAR2(1000); 4 CURRENTINDEX NUMBER; 5 STARTINDEX NUMBER; 6 ENDINDEX NUMBER; 7 8 TYPE STR_TYPE IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER; 9 ARR STR_TYPE; 10 11 RESULT VARCHAR2(1000); 12 BEGIN 13 -- 空字符串 14 IF OLDSTR IS NULL THEN 15 RETURN(''); 16 END IF; 17 --字符串太长 18 IF LENGTH(OLDSTR) > 1000 THEN 19 RETURN(OLDSTR); 20 END IF; 21 STR := OLDSTR; 22 23 CURRENTINDEX := 0; 24 STARTINDEX := 0; 25 26 LOOP 27 CURRENTINDEX := CURRENTINDEX + 1; 28 ENDINDEX := INSTR(STR, SIGN, 1, CURRENTINDEX); 29 IF (ENDINDEX <= 0) THEN 30 EXIT; 31 END IF; 32 33 ARR(CURRENTINDEX) := TRIM(SUBSTR(STR, 34 STARTINDEX + 1, 35 ENDINDEX - STARTINDEX - 1)); 36 STARTINDEX := ENDINDEX; 37 END LOOP; 38 39 --取最后一个字符串: 40 ARR(CURRENTINDEX) := SUBSTR(STR, STARTINDEX + 1, LENGTH(STR)); 41 42 --去掉重复出现的字符串: 43 FOR I IN 1 .. CURRENTINDEX - 1 LOOP 44 FOR J IN I + 1 .. CURRENTINDEX LOOP 45 IF ARR(I) = ARR(J) THEN 46 ARR(J) := ''; 47 END IF; 48 END LOOP; 49 END LOOP; 50 51 STR := ''; 52 FOR I IN 1 .. CURRENTINDEX LOOP 53 IF ARR(I) IS NOT NULL THEN 54 STR := STR || SIGN || ARR(I); 55 --数组置空: 56 ARR(I) := ''; 57 END IF; 58 END LOOP; 59 --去掉前面的标识符: 60 RESULT := SUBSTR(STR, 2, LENGTH(STR)); 61 RETURN(RESULT); 62 END REMOVESAMESTR;