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: ; ;
随机推荐
- python基础学习1-装饰器及应用
def outer(func): #定义装饰器 def inner(*args,**kwargs): #定义万能参数 print("log") ret = func(*args,* ...
- 【转载】COM 组件设计与应用(四)——简单调用组件
原文:http://vckbase.com/index.php/wv/1211.html 一.前言 同志们.朋友们.各位领导,大家好. VCKBASE 不得了, 网友众多文章好. 组件设计怎么学? 知 ...
- zhengruioi 470 区间
区间 链接 题意:给定n个区间[li,ri].你可以选出任意一些区间,设选出的区间个数是s,[l,r]是这些区间的交,求min(s,r-l+1)的最大值. N≤3×105 分析:首先按照左端点排序,然 ...
- taglib报错The content of element type "taglib" must match "(tlib-version,...)
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE taglib PUBLIC "-// ...
- java程序性能优化读书笔记-垃圾回收
衡量系统性能的点 执行速度:即响应时间 内存分配:内存分配是否合理,是否过多消耗内存或者存在内存泄露 启动时间:程序从启动到正常处理业务需要的时间 负载承受能力:当系统压力上升,系统执行速度和响应时间 ...
- java对象是如何创建的
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符合引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程. 在类加 ...
- Macaca环境搭建全教程
首先想要会Macaca,还得先会用github,不然你得死……因为各种例子都在git上,官网也一样,蛋疼的很…… #基础环境 1.JDK:jdk1.8-配置变量 2.Android SDK:sdk ...
- android 判断应用是否在前台显示
在一些场景下我们需要知道应用是否在前台显示,当不在前台显示的时候,一些后台进程可以暂时停止,比如一些查询任务.不必要的线程.不需要的渲染等,以减少对设备资源的占用.判断应用是否在前台通常可以使用一下方 ...
- Qt-网易云音乐界面实现-5 收藏列表,播放列表实现 QListWidget QTableWidget
先上目前完成的内容吧,发现后面越写越多.在看看点击量,心凉凉. 完成了左侧的导航列表,还有就是右下角的播放列表. //创建的歌单 my_Create_Music_List = new QListWid ...
- Python 字符串 整数 浮点数
• 几个函数: str() : 将一个整数或者浮点数变成字符串 int() : 将一个浮点数或一个字符串变成整数 float : 将一个整数或者字符串变成一个浮点型数据 • 整数的运算永远是精确的,而 ...