工作中用到的oracle字符串分割整理
oracle部分:
定义类型(用于字符串分割):
create or replace
TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000);
字符串分割函数:
create or replace
FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
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;
运行效果:
sql:select CRM.SPLITSTR(',100001240,,100001241,4567890,',',') from dual;

sql:SELECT * FROM TABLE(SPLITSTR(',100001240,,100001241,4567890,',','))


引申sql:
SELECT * FROM TABLE(SPLITSTR(',100001240,,100001241,4567890,',',')) WHERE column_value IN ('100001240','100001241','2345','234567');

mybaits+oracle:
sql:(说明:将字符串以特定字符分割,然后拼接成特定记录,然后和已存在表数据做比较(按特定字段)筛选出不存在的记录然后再做记录拼接完成插入操作)
功能说明:可以达到批量插入不用管记录是否存在,已存在的记录会被排除在外
insert into CRM.d_business_link (
select t.*, #{account,jdbcType=VARCHAR} ,sysdate from
(SELECT #{customer,jdbcType=VARCHAR} AS HOST,
customers.*,
#{relationship,jdbcType=VARCHAR} AS RELATION
FROM
(SELECT * FROM TABLE(CRM.SPLITSTR(#{selected_dCuscode,jdbcType=VARCHAR},','))
) customers
minus
select Host,CUSTOMER,relation from CRM.d_business_link
)t)
下面这个不知道该说设计有问题还是需求变态但也不小心给实现了,真佩服我自己啊,
首先说设计:字典表(应该懂的吧用于动态维护:按分组的形式保存着字典间的映射关系)
一个表(产品表)用到字典表 这样设计没啥问题吧,问题就在于一个字段采用分隔符的形式保存了字典项。
需求:把一批记录通过字典表转换成能识别的有意义记录。
原始记录:
gjzdgc,tljs,slsl,shsc,jcjs,qljs
gycf,slsl,sydc,ggjz,jcjs,qljs
slsl,shsc,sydc,qljs
gjzdgc,gsgl,yzsc,shsc,jcjs,qljs
grzx,gsgl,qljs
grzx
gjzdgc,gsgl,slsl,shsc,sydc,qljs
目标记录:
国家重点工程,水利枢纽,商混生产,铁路工程,机场工程,桥梁工程
水利枢纽,商业地产,公共建筑,工业厂房,机场工程,桥梁工程
水利枢纽,商混生产,商业地产,桥梁工程
国家重点工程,高速公路,商混生产,预制生产,机场工程,桥梁工程
个人装修,高速公路,桥梁工程
个人装修
国家重点工程,高速公路,水利枢纽,商混生产,商业地产,桥梁工程
sql:
select
(
SELECT WMSYS.WM_CONCAT(dd_infoname)
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr(p_userful,',')))
) as P_USERFUL,p_userful
,a.*
FROM c_product a;
思路:
1.
SELECT dd_infoname
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr('gycf,slsl,sydc,ggjz,jcjs,qljs',',')))

2.通过函数WM_CONCAT将记录转换成以逗号分割的一条记录(可好像是10g后才有的,挺强大的需详细了解请问度娘)
SELECT WM_CONCAT(dd_infoname)
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr('gycf,slsl,sydc,ggjz,jcjs,qljs',',')))

3.oracle 底层处理了不太清楚
sql:
select
(
SELECT WM_CONCAT(dd_infoname)
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr(p_userful,',')))
) as P_USERFUL,p_userful
FROM c_product ;

至此ok。完成了
工作中用到的oracle字符串分割整理的更多相关文章
- C#为工作Sql而产生的字符串分割小工具(很实用,你值得拥有)
写在前面 为什么要写这个工具? 工作需要,拼接字符串头晕眼花拼接的,特别是in 查询,后面的参数太多,想在数据执行一些这个sql语句老费劲了. 看正文 工作所有的(后台)攻城狮们都会接触到sql语句, ...
- Oracle 字符串分割排序冒泡算法
例子: 一个字符串"11,15,13,17,12",以逗号分割,现在要排序成"11,12,13,15,17". 写了一个实现方法,记录下来以备后用: ----- ...
- Oracle字符串分割函数
今天在创建视图的时候,碰到一个问题,问题如下: 将字符格式为“XXX,YYY”分割出来,并且分割后作为两个字段放入视图中. 考虑使用字符分割函数,但是查找资料Oracle没有字符分割的函数(我对Ora ...
- oracle 字符串分割
); create or replace function strsplit2(p_value varchar2, p_split varchar2 := ',') return str_split ...
- oracle 字符串分割函数
首先创建一个类型: CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000); 创建函数: CREATE OR REPLACE FUNC ...
- Oracle字符串分割Split(超简单一条sql解决)
) FROM renyuan where name ='张三' 解决如下问题 我现在有一个字段是存:,,3的,而它对应另一张值集表中.eg; 课程人员表 renyuan id name Course ...
- Oracle拆分字符串,字符串分割的函数。
第一种:oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2, --要分割的字符串 av_ ...
- Oracle 超长字符串分割劈分
Oracle 超长字符串分割劈分,具体能有多长没测过,反正很大.... 下面,,,,直奔主题了: CREATE OR REPLACE FUNCTION splitstr(p_string IN clo ...
- oracle根据分隔符将字符串分割成数组函数
--创建表类型 create or replace type mytype as table of number;--如果定义成varchar--CREATE OR REPLACE type myty ...
随机推荐
- C# HttpWebRequest GET HTTP HTTPS 请求
下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需要获取认证信息(如Cookie),所以返回的是HttpWebResponse ...
- linux 无交互添加用户设置密码
#!/bin/bash useradd -m test echo " | passwd --stdin test
- python进阶(四)---需要了解的魔法方法
以下内容,源于个人理解所得,纯属臆测,爱信不信:-D.欢迎大家留言讨论指正. 1.__new__魔法方法: 原型:__new__(cls, *args, **kwargs) 说明:__new__魔法方 ...
- React 快速入门小记
大约半个月前,我一直在思考一个问题,Angular.React 和 Vue,究竟该学什么? 听取了几位前辈的意见,也综合考虑了各方面的原因,最终选择了 React,希望我"没有选错" ...
- 第三方的图片加载( Android-Universal-Image-Loader)
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示. (1).使用多线程加载图片(2).灵活配置Im ...
- Ios二维码扫描(系统自带的二维码扫描)
Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...
- 服务器上index.jsp变空
早上,前五分钟3台分别浏览了3台服务器,都是正常的,一会后台说其中一台打开页面是空白的,发现这台服务器上的index.jsp文件变成了空白.用其他服务器上的index.jsp文件覆盖,蹦出了另一个错误 ...
- 关于Tomcat在eclipse上的配置
一:安装JDK(建议版本比较新的jdk,因为有很多集成于jdk软件需要的jdk版本比较高): jdk官网下载位置:http://www.oracle.com/technetwork/java/java ...
- java:经典消费生成者
产品类: public class Info { private String title = "生产"; private String content = "生产罐头& ...
- django表单
一.主要内容 1.服务端获取HttpRequest信息 1)url相关信息 2)HttpRequest.META中包含的键值对 3)HttpRequest中用 ...