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);
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 取俩个字符串的差集的更多相关文章
- oracle 取前10条记录
1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...
- oracle文字与格式字符串不匹配的解决
oracle文字与格式字符串不匹配的解决 oracle的日期时间类型 在往oracle的date类型插入数据的时候,记得要用to_date()方法. 如insert into CUSLOGS(STAR ...
- oracle中如何对字符串进行去除空格的方法
oracle中如何对字符串进行去除空格的方法 今天学习了一下oracle中如何对字符串进行去除空格的方法,这里总结一下.了解到的方法主要有两种:Trim函数以及Replace函数.下面我详细的介绍一下 ...
- Oracle 取两个表中数据的交集并集差异集合
Oracle 取两个表中数据的交集 关键字: Oracle 取两个表中数据的交集 INTERSECT Oracle 作为一个大型的关系数据库,日常应用中往往需要提取两个表的交集数据 例如现有如下表,要 ...
- Oracle 取上周一到周末日期的查询语句
-- Oracle 取上周一到周末的sql -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20130906','yyyymmdd'),'d') f ...
- Oracle 取前几条记录
今天看了篇文章,对oracle取前几条数据的方式和说明,总结比较全,学习了,做个记录点.oracle 取前10条记录 以下内容是原始文章内容,用于做留存阅读. 1.oracle 取前10条记录 1) ...
- ||在oracle数据库中起到字符串拼接的作用
例子:select org.id from org where inner_code like '12011601001' || '%' ||在oracle数据库中起到字符串拼接的作用,上面等同于'1 ...
- Oracle 解决【ORA-01704:字符串文字太长】(转)
错误提示:oracle在toad中执行一段sql语句时,出现错误‘ORA-01704:字符串文字太长’.如下图: 原因:一般为包含有对CLOB字段的数据操作.如果CLOB字段的内容非常大的时候,会导致 ...
- Oracle取查询结果数据的第一条记录SQL
Oracle取查询结果数据的第一条记录SQL: ; ;
随机推荐
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
场景 1.使用win32绘图时, 最简单的api是使用 graphics.DrawImage(image,x,y)来绘制, 可是这个api有个坑,它的图片显示完整和设备分辨率(显卡)有关. 说明 1. ...
- ASP.NET Core开发期间部署到IIS自定义主机域名并附加到进程调试
在.NET Framework环境下,我们经常会这么做 把一个web项目不经过发布直接部署到IIS里去,配置上主机名,修改一下hosts文件,就可以用自定义的域名来访问我们的应用程序,使用附加到进程( ...
- java日志框架log4j详细配置及与slf4j使用教程
一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...
- eclipse下载与安装并测试
下载地址:www.ecplise.org 下载完成后双击安装 安装完成之后,第一次运行eclipse会弹出Workspace Launcher对话框,要求设置工作空间存放项目文档. ...
- 程序员,Python 这次彻底上位了!
在 2018 年底,我们迎来了编程语言的最后一波洗礼.近期 TIOBE 公布了 12 月编程语言排行榜,前三名变为: Java.C.Python. 而在 PYPL 榜单上 Python 在今年 5 月 ...
- 办公区公网Ip访问不到阿里云ECS
办公区公网Ip访问不到阿里云ECS 工作中遇见这样的问题, Hadoop 部署在办公区内网, 而应用有些的数据在阿里云ECS主机中,现在hadoop 访问ECS 却访问不到ESC ,最终电话咨询阿里云 ...
- TortoiseGit版本库中某个文件显示问号或叹号的问题解决办法
这是一个怪问题,原因就是文件名大小写与版本库管理的大小写不一致. 解决办法: 1.先把文件夹中的物理文件名改为版本库浏览器中显示的文件名(版本库浏览器中的文件名不知道怎么改),改了以后这个文件图标就变 ...
- Vue渲染数据理解以及Vue指令
一.Vue渲染数据原理 原生JS改变页面数据,必须要获取页面节点,也即是进行DOM操作,jQuery之类的框架只是简化DOM操作的写法,实质并没有改变操作页面数据的底层原理,DOM操作影响性能(导致浏 ...
- AssociatedObject关联对象原理实现
介绍 关联对象(AssociatedObject)是Objective-C 2.0运行时的一个特性,允许开发者对已经存在的类在扩展中添加自定义的属性.在实际生产过程中,比较常用的方式是给分类(Cate ...
- js传输txt文档内容
要求:实现修改text文档内容,即可将text修改内容传到页面显示: HTML: <!doctype html> <html lang="en"> < ...