思路:

--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);

 CREATE OR REPLACE FUNCTION REMOVESAMESTR(OLDSTR VARCHAR2, SIGN VARCHAR2)
RETURN VARCHAR2 IS
STR VARCHAR2(1000);
CURRENTINDEX NUMBER;
STARTINDEX NUMBER;
ENDINDEX NUMBER; TYPE STR_TYPE IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
ARR STR_TYPE; RESULT VARCHAR2(1000);
BEGIN
-- 空字符串
IF OLDSTR IS NULL THEN
RETURN('');
END IF;
--字符串太长
IF LENGTH(OLDSTR) > 1000 THEN
RETURN(OLDSTR);
END IF;
STR := OLDSTR; CURRENTINDEX := 0;
STARTINDEX := 0; LOOP
CURRENTINDEX := CURRENTINDEX + 1;
ENDINDEX := INSTR(STR, SIGN, 1, CURRENTINDEX);
IF (ENDINDEX <= 0) THEN
EXIT;
END IF; ARR(CURRENTINDEX) := TRIM(SUBSTR(STR,
STARTINDEX + 1,
ENDINDEX - STARTINDEX - 1));
STARTINDEX := ENDINDEX;
END LOOP; --取最后一个字符串:
ARR(CURRENTINDEX) := SUBSTR(STR, STARTINDEX + 1, LENGTH(STR)); --去掉重复出现的字符串:
FOR I IN 1 .. CURRENTINDEX - 1 LOOP
FOR J IN I + 1 .. CURRENTINDEX LOOP
IF ARR(I) = ARR(J) THEN
ARR(J) := '';
END IF;
END LOOP;
END LOOP; STR := '';
FOR I IN 1 .. CURRENTINDEX LOOP
IF ARR(I) IS NOT NULL THEN
STR := STR || SIGN || ARR(I);
--数组置空:
ARR(I) := '';
END IF;
END LOOP;
--去掉前面的标识符:
RESULT := SUBSTR(STR, 2, LENGTH(STR));
RETURN(RESULT);
END REMOVESAMESTR;

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

 CREATE OR REPLACE FUNCTION COMPARETWOSTR(IN_STR IN VARCHAR2)
RETURN VARCHAR2 AS
RESULTSTR VARCHAR2(4000);
BEGIN
SELECT LISTAGG(STR, ',') WITHIN GROUP(ORDER BY STR)
INTO RESULTSTR
FROM (SELECT LEVEL STR
FROM DUAL
CONNECT BY LEVEL <= 17
MINUS
SELECT TO_NUMBER(COLUMN_VALUE) STR
FROM TABLE(SPLITSTR(IN_STR, ',')));
RETURN RESULTSTR;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE || SQLERRM ||
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
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);

 CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
/**********************************************************************
* xdshi add blockment 2015-09-21
* 通用方法:按列返回分割字符串后的内容
* 入参:p_string 分割字符串
* p_delimiter 分割符
* 返回:每个分割出来的字符串
**********************************************************************/
RETURN str_split
PIPELINED
AS
v_length NUMBER := LENGTH(p_string);
v_start NUMBER := 1;
v_index NUMBER;
BEGIN
WHILE(v_start <= v_length)
LOOP
v_index := INSTR(p_string, p_delimiter, v_start); IF v_index = 0
THEN
PIPE ROW(SUBSTR(p_string, v_start));
v_start := v_length + 1;
ELSE
PIPE ROW(SUBSTR(p_string, v_start, v_index - v_start));
v_start := v_index + 1;
END IF;
END LOOP; RETURN;
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. c++ 双向循环链表

    教学内容: 循环双链表 建立循环双链表 循环链表里插入结点 遍历循环链表 双向链表结构定义 struct stu_data { ];//学生名字 struct mytime stuTime;/ ...

  2. python基础学习1-描述符

    #!/usr/bin/env python # -*- coding:utf-8 -*- #描述符就是将某种特殊类型的类的实例指派给另一个类的属性 #特殊类型指 实现了 # __get__(self, ...

  3. com.jcraft.jsch.JSchException: java.io.FileNotFoundException: file:\D:\development\ideaProjects\salary-card\target\salary-card-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\keystore\login_id_rsa 资源未找到

    com.jcraft.jsch.JSchException: java.io.FileNotFoundException: file:\D:\development\ideaProjects\sala ...

  4. 为firefox添加flash插件

    需要自行下载flash for firefox进行安装,安装后即可看到 Shockwave Flash 插件

  5. Zabbix实战-简易教程--业务类

    一.需求 项目要求对线上服务器进行监控,包括服务器本身状态.进程相关数据.业务相关数据. 服务器本身状态可以通过基础模板即可获取数据(CPU.内存.网络.磁盘): 进程相关数据,前面也有相关文章专门监 ...

  6. 公网API安全--OAuth认证

    之前写过一个基于签名的公网API访问安全控制,另一种方式是基于OAuth认证协议做安全控制. 说明 用户访问A客户端,使用B的服务及资源.B只有征得用户的授权,才允许A客户端使用B上用户的资源和服务. ...

  7. String.valueOf(object).trim())

    获得对象的字段的值,然后转成string类型,并且去掉前后空白~~ToString()是转化为字符串的方法 Trim()是去两边空格的方法把StringBuffer转换成String类型时 没有用.t ...

  8. 多个EXCEL文件合并成一个

    Python的numpy处理起来会比较方便,有空实现一下,这里是Excel内部代码的方式: 合并方法如下: 1.需要把多个excel表都放在同一个文件夹里面,并在这个文件夹里面新建一个excel.如图 ...

  9. python打印对象的所有可操作内容

    print('\n'.join(['%s:%s' % item for item in 对象.__dict__.items()]))

  10. BP神经网络算法推导

    目录 前置知识 梯度下降法 激活函数 多元复合函数求偏导的相关知识 正向计算 符号定义 输入层 隐含层 输出层 误差函数 反向传播 输出层与隐含层之间的权值调整 隐含层与输入层之间权值的调整 计算步骤 ...