思路:

  1. --funcation RemoveSameStr(in_str,splitStr) ;用于去除重复值 ;
  2. SELECT b.memberid, RemoveSameStr(wm_concat(b.productidlist),',') AS productidlist
  3. FROM BASE_ACCOUNT_BILL_GROUP b
  4. WHERE b.grouptype =3
  5. 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;

3.创建 Function COMPARETWOSTR(IN_STR IN VARCHAR2) ;

  1. CREATE OR REPLACE FUNCTION COMPARETWOSTR(IN_STR IN VARCHAR2)
  2. RETURN VARCHAR2 AS
  3. RESULTSTR VARCHAR2(4000);
  4. BEGIN
  5. SELECT LISTAGG(STR, ',') WITHIN GROUP(ORDER BY STR)
  6. INTO RESULTSTR
  7. FROM (SELECT LEVEL STR
  8. FROM DUAL
  9. CONNECT BY LEVEL <= 17
  10. MINUS
  11. SELECT TO_NUMBER(COLUMN_VALUE) STR
  12. FROM TABLE(SPLITSTR(IN_STR, ',')));
  13. RETURN RESULTSTR;
  14. EXCEPTION
  15. WHEN OTHERS THEN
  16. DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM ||
  17. DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
  18. END COMPARETWOSTR;

4.创建 function splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN str_split ;

CREATE OR REPLACE TYPE "STR_SPLIT"   IS TABLE OF VARCHAR2 (4000);

  1. CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
  2. /**********************************************************************
  3. * xdshi add blockment 2015-09-21
  4. * 通用方法:按列返回分割字符串后的内容
  5. * 入参:p_string 分割字符串
  6. * p_delimiter 分割符
  7. * 返回:每个分割出来的字符串
  8. **********************************************************************/
  9. RETURN str_split
  10. PIPELINED
  11. AS
  12. v_length NUMBER := LENGTH(p_string);
  13. v_start NUMBER := 1;
  14. v_index NUMBER;
  15. BEGIN
  16. WHILE(v_start <= v_length)
  17. LOOP
  18. v_index := INSTR(p_string, p_delimiter, v_start);
  19.  
  20. IF v_index = 0
  21. THEN
  22. PIPE ROW(SUBSTR(p_string, v_start));
  23. v_start := v_length + 1;
  24. ELSE
  25. PIPE ROW(SUBSTR(p_string, v_start, v_index - v_start));
  26. v_start := v_index + 1;
  27. END IF;
  28. END LOOP;
  29.  
  30. RETURN;
  31. END splitstr;

5.最终结果

oracle 取俩个字符串的差集的更多相关文章

  1. oracle 取前10条记录

    1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...

  2. oracle文字与格式字符串不匹配的解决

    oracle文字与格式字符串不匹配的解决 oracle的日期时间类型 在往oracle的date类型插入数据的时候,记得要用to_date()方法. 如insert into CUSLOGS(STAR ...

  3. oracle中如何对字符串进行去除空格的方法

    oracle中如何对字符串进行去除空格的方法 今天学习了一下oracle中如何对字符串进行去除空格的方法,这里总结一下.了解到的方法主要有两种:Trim函数以及Replace函数.下面我详细的介绍一下 ...

  4. Oracle 取两个表中数据的交集并集差异集合

    Oracle 取两个表中数据的交集 关键字: Oracle 取两个表中数据的交集 INTERSECT Oracle 作为一个大型的关系数据库,日常应用中往往需要提取两个表的交集数据 例如现有如下表,要 ...

  5. Oracle 取上周一到周末日期的查询语句

    -- Oracle 取上周一到周末的sql -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20130906','yyyymmdd'),'d') f ...

  6. Oracle 取前几条记录

    今天看了篇文章,对oracle取前几条数据的方式和说明,总结比较全,学习了,做个记录点.oracle 取前10条记录 以下内容是原始文章内容,用于做留存阅读. 1.oracle 取前10条记录 1) ...

  7. ||在oracle数据库中起到字符串拼接的作用

    例子:select org.id from org where inner_code like '12011601001' || '%' ||在oracle数据库中起到字符串拼接的作用,上面等同于'1 ...

  8. Oracle 解决【ORA-01704:字符串文字太长】(转)

    错误提示:oracle在toad中执行一段sql语句时,出现错误‘ORA-01704:字符串文字太长’.如下图: 原因:一般为包含有对CLOB字段的数据操作.如果CLOB字段的内容非常大的时候,会导致 ...

  9. Oracle取查询结果数据的第一条记录SQL

    Oracle取查询结果数据的第一条记录SQL: ; ;

随机推荐

  1. 9 stark组件 增删改

    1.效果图 2.详细步骤解析 1.构造增删改查url,反向解析 2.ModelForm定制add.edit页面 3.staradmin中的ModelForm 3.总结.代码 1.知识点 1.解决代码重 ...

  2. P3704 [SDOI2017]数字表格

    P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...

  3. C++STL学习笔记_(2)deque双端数组知识

    #include<iostream> using namespace std; #include "deque" #include "algorithm&qu ...

  4. python之GIL(Global Interpreter Lock)

    一 介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...

  5. Object C学习笔记5-ARC forbids explicit message* 编译错误

    在学习Object C的过程中XCode 编译器经常出现 "ARC forbids explicit message send of release" 的错误提示. 以上问题主要出 ...

  6. form提交方式Get与Post详解

    form作为Html的一个元素,它就是为了客户端提交数据而产生的,它有两个很重要的属性action和method,action属性指明了处理提交的数据的应用程序的URL,而method有两个值:POS ...

  7. React Native开启实时重载(Enable live Reload)

    传统的原生应用开发中,每一次修改都需要重新编译. 但在 RN 中你只需要刷新一下 JavaScript 代码,就能立刻看到变化. 操作 1.安卓模拟器 按下Ctrl + M,Enable live R ...

  8. c# 缓存详解

    如果说要对一个站点或者应用程序经常优化,可以说缓存的使用是最快也是效果最明显的方式.一般而言,我们会把一些常用的,或者需要花费大量的资源或时间而产生的数据缓存起来,使得后续的使用更加快速. 如果真要细 ...

  9. 在腾讯ubuntu云服务器上面部署asp.net core 2.1网站

    微软以后的政策肯定是在开源和跨平台这一块,所以最近在学习asp.net core 2.1,查看市面上面大部分的把asp.net core部署在Linux后,决定亲自实验一番,不操作不知道,居然最新版本 ...

  10. 180804-Spring之动态注册bean

    Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运 ...