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字符串分割整理的更多相关文章

  1. C#为工作Sql而产生的字符串分割小工具(很实用,你值得拥有)

    写在前面 为什么要写这个工具? 工作需要,拼接字符串头晕眼花拼接的,特别是in 查询,后面的参数太多,想在数据执行一些这个sql语句老费劲了. 看正文 工作所有的(后台)攻城狮们都会接触到sql语句, ...

  2. Oracle 字符串分割排序冒泡算法

    例子: 一个字符串"11,15,13,17,12",以逗号分割,现在要排序成"11,12,13,15,17". 写了一个实现方法,记录下来以备后用: ----- ...

  3. Oracle字符串分割函数

    今天在创建视图的时候,碰到一个问题,问题如下: 将字符格式为“XXX,YYY”分割出来,并且分割后作为两个字段放入视图中. 考虑使用字符分割函数,但是查找资料Oracle没有字符分割的函数(我对Ora ...

  4. oracle 字符串分割

    ); create or replace function strsplit2(p_value varchar2, p_split varchar2 := ',') return str_split ...

  5. oracle 字符串分割函数

    首先创建一个类型: CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000); 创建函数: CREATE OR REPLACE FUNC ...

  6. Oracle字符串分割Split(超简单一条sql解决)

    ) FROM renyuan where name ='张三' 解决如下问题 我现在有一个字段是存:,,3的,而它对应另一张值集表中.eg; 课程人员表 renyuan id name Course ...

  7. Oracle拆分字符串,字符串分割的函数。

    第一种:oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2, --要分割的字符串 av_ ...

  8. Oracle 超长字符串分割劈分

    Oracle 超长字符串分割劈分,具体能有多长没测过,反正很大.... 下面,,,,直奔主题了: CREATE OR REPLACE FUNCTION splitstr(p_string IN clo ...

  9. oracle根据分隔符将字符串分割成数组函数

    --创建表类型 create or replace type mytype as table of number;--如果定义成varchar--CREATE OR REPLACE type myty ...

随机推荐

  1. App瘦身

    http://www.zoomfeng.com/blog/ipa-size-thin.html https://github.com/ming1016/SMCheckProject

  2. 腾讯QQ你的缓存策略应该改下了

    缓存策略基本原则大家都怎么考虑的? 缓存好友数量这个也是醉了,这个数字好像变化频率有点低吧,ok,就算你企鹅用户量大,需要缓存,那肉肉的问一句你这更新策略也不能只管网上涨的,不管往下降的吧?难不成你是 ...

  3. 获取div或者元素相对于屏幕坐上角的绝对位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JavaScript继承

    最佳的继承范式 寄生组合继承 我们来看一下它的实现方式: function Object(o){ var TempObject = function(){}; TempObject.prototype ...

  5. SQL出错

    2016-12-26 15:43:02,870 DEBUG [org.springframework.test.context.support.DirtiesContextTestExecutionL ...

  6. hrbust1841再就业(状态压缩dp)

    本人刚学压缩dp,只能对这些水题写题解 一方面对自己的理解有加深作用 另一方面希望和各位大牛交流交流..... 如果有对状态dp不太了解的童鞋可以参考入门知识:http://wenku.baidu.c ...

  7. 可拖拽和带预览图的jQuery文件上传插件ssi-uploader

    插件描述:ssi-uploader是一款带预览图并且可以拖拽文件的jQuery ajax文件上传插件.该文件上传插件支持AJAX,支持多文件上传,可控制上的文件格式和文件大小,提供各种回调函数,使用非 ...

  8. web 打开子窗口提交数据或其他操作后 关闭子窗口且刷新父窗口实现

    父页面 : html连接:<a href="javascript:void(0)" onclick="window.open(子页面URL)">js ...

  9. Michael Schatz - 序列比对课程

    Michael Schatz - Cold Spring Harbor Laboratory 最近在研究 BWA mem 序列比对算法,直接去看论文,看不懂,论文就3页,太精简了,好多背景知识都不了解 ...

  10. gvim 快速编辑例子

    1 准备工作 首先, 我们打开 VIM, 输入一段文本,  用于今天的演示: this is a test 2 查找替换 按几下 ESC 进入 Normal 模式, 输入以下命令: :%s/ /\r/ ...