oracle逗号隔开行转列_oralce逗号分割变多行 Oracle中REGEXP_SUBSTR函数
Oracle中REGEXP_SUBSTR函数 Oracle 中REGEXP_SUBSTR函数的使用说明: 题目如下:在 oracle 中,使用一条语句实现将’17,20,23’拆分成’17’,’20’,’23’的集合。 REGEXP_SUBSTR函数格式如下:function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr :需要进行正则处理的字符串 __pattern :进行匹配的正则表达式 __position :起始位置,从第几个字符开始正则表达式匹配(默认为 1)__occurrence :标识第几个匹配组,默认为 1__modifier :模式(’i’不区分大小写进行检索;’c’区分大小写进行检索。默认为’c’。) 1、查询使用正则分割后的第一个值,也就是 17[sql] SELECT REGEXP_SUBSTR(‘17,20,23′,'[^,]+’,1,1,’i’) AS STR FROM DUAL; 结果: www.2cto.com STR—–17 2、查询使用正则分割后的最后一个值,也就是 23[sql] SELECT REGEXP_SUBSTR(‘17,20,23′,'[^,]+’,1,3,’i’) AS STR FROM DUAL; 结果:STR—-23 3、获取一个多个数值的列,从而能够让结果以多行的形式展示出来[sql] SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=7; 结果: www.2cto.com LEVEL—-1234567 4、将上面 REGEXP_SUBSTR 的 occurrence 关联[sql] SELECT NVL(REGEXP_SUBSTR(‘17,20,23’, ‘[^,]+’, 1, LEVEL, ‘i’), ‘NULLL’) AS STR FROM DUAL CONNECT BY LEVEL <= 7; STR www.2cto.com —-172023NULLNULLNULLNULL 5、优化上面的 SQL 语句,让生成的行的数量符合实际情况[sql] SELECT REGEXP_SUBSTR(‘17,20,23’, ‘[^,]+’, 1, LEVEL, ‘i’) AS STR FROM DUAL CONNECT BY LEVEL <= LENGTH(‘17,20,23’) – LENGTH(REGEXP_REPLACE(‘17,20,23’, ‘,’, ”))+1; STR—-172023
方法一
select a.* ,
REGEXP_SUBSTR(a.rolecode ,'[^,]+’,1,l) AS rolecode
from p_user a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(a.rolecode) – LENGTH(REPLACE(rolecode,’,’))+1
www.2cto.com
使用函数REGEXP_SUBSTR 拆分字符串:
5 个参数
第一个是输入的字符串
第二个是正则表达式
第三个是标识从第几个字符开始正则表达式匹配。(默认为 1)
第四个是标识第几个匹配组。(默认为 1)
第五个是是取值范围:
i:大小写不敏感;
c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。
SELECT a.*,REGEXP_SUBSTR(servicereqid ,'[^;]+’,1,l) AS servicereq
FROM sum_portal_satisfaction a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(servicereqid) – LENGTH(REPLACE(servicereqid,’;’))+1
ORDER BY 1,2;
—-SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100; 生成 1 到 100 的数据行。
—-l <=LENGTH(servicereqid) – LENGTH(REPLACE(servicereqid,’;’))+1,注意此处是‘L’并非‘1’,上面的 REGEXP_SUBSTR 的第四个参数也一样。
—下面为拆分字符串,再进行的行转列
create or replace view v_sum_portal_satisfaction_sr as
select
survey_type,
survey_time,
center_code,
center_name,
city_id,
city_name,
REGEXP_SUBSTR(servicereqid ,'[^;]+’,1,l) AS servicereqid,
REGEXP_SUBSTR(servicereqname ,'[^;]+’,1,l) AS servicereqname,
sum(decode(survey_value,0, sur_times,null)) giveup_times,–调查值 -1:未处理 0:用户放弃 1:很满意 2.满意 3.对 csr 不满意 4.对其它不满意
sum(decode(survey_value,1, sur_times,null))vsatis_times,
sum(decode(survey_value,2, sur_times,null))satis_times,
sum(decode(survey_value,3, sur_times,null))ncsr_times,
sum(decode(survey_value,4, sur_times,null))nelse_times,
sum(sur_times) sur_times
FROM sum_portal_satisfaction a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(servicereqid) – LENGTH(REPLACE(servicereqid,’;’))+1
group by
subslevelid,
center_code,
center_name,
city_id,
city_name,
survey_type,
survey_time,
servicereqid,
servicereqname,l
方法二:
create table testTable (
id nvarchar2(200) primary key not null ,
content nvarchar2(200) not null
)
insert into testTable values (‘4′,’馆内 idx_10 馆外 idx_11 总体 idx_12’);
select * from table ( CAST (fn_split((‘馆内 idx_1$馆外 idx_2$总体 idx_3$’) ,’$’) as ty_str_split ) )
select * from testtable b left join table (fn_split((content), ‘$’) ) a on 1=1;
–实现 split 函数
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j – i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
DECLARE
CURSOR c
IS
select * from table ( CAST (fn_split((‘馆内 idx_1$馆外 idx_2$总体 idx_3$’) ,’$’) as ty_str_split ) );
r c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO r;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.put_line (r.column_value);
END LOOP;
CLOSE c;
END;
露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:oralce逗号分割变多行 Oracle中REGEXP_SUBSTR函数
oracle逗号隔开行转列_oralce逗号分割变多行 Oracle中REGEXP_SUBSTR函数相关推荐
- oracle逗号隔开行转列_oralce逗号分割变多行-Oracle
oralce逗号分割变多行 方法一 select a.* , REGEXP_SUBSTR(a.rolecode ,'[^,]+',1,l) AS rolecode from p_user a,(S ...
- Oracle中REGEXP_SUBSTR函数
http://www.2cto.com/database/201209/154045.html Oracle中REGEXP_SUBSTR函数 Oracle中REGEXP_SUBSTR函数的使用说明: ...
- mysql 复杂行转列_有趣的SQL(四) 行转列的复杂应用和优化思想
原标题:有趣的SQL(四) 行转列的复杂应用和优化思想 导读 本文节选自松华老师<SQL优化专栏> 大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章:有趣的SQL ...
- mysql 复杂行转列_有趣的SQL(4) 行转列的复杂应用和优化思想
大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 在之前的的系列文章中,有意思的SQL(3) 行转列,列转行和复制 已经给大家介绍了,行转列,列转行,复制等方法. 在这篇文章中,对其进行更深一层 ...
- SparkSQL读取hive中的数据,行转列的两种方式【行转列专用函数,UDAF】
先给数据: vi employees 1,George,nan 2,honey,nv 3,georgedage,nan 4,kangkang,nv 上传数据: hdfs dfs -mkdir /sec ...
- mysql 行转列分级输出_MySQL如何实现行转列分级输出?_MySQL
概述 好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下. 问题链接:关于Mysql 的分级输出问题 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当 ...
- android webservices 返回多行多列数据,NoahWeb实现表格多行多列
用NoahWeb的表现层指令可以在动态生成的页面中非常容易的实现多行多列的表格.在正式学习以前我们需要先来了解一下怎么用NoahWeb的表现层来做动态内容显示. 在NoahWeb设计器中新建或打开一项 ...
- linq to sql 行转列_n套SQL面试题--行转列、留存、日活等
第一套 面试题1.请写出表一中各地市客户数.总费用(ARPU之和) 的SQL语句 2.请写出表一中各地市ARPU(0,30),[30,50),[50-80),[80以上)客户数分别是多少的SQL语句 ...
- python中pandas.DataFrame如何对行与列求和以及如何添加新行与列的示例
转载 本文介绍的是python中DataFrame对行与列求和及添加新行与列的相关资料,下面话不多说,来看看详细的介绍吧. 方法如下: 导入模块: from pandas import DataFra ...
最新文章
- java 二叉堆_二叉堆(三)之 Java的实现
- 「 每日一练,快乐水题 」599. 两个列表的最小索引总和
- mysql打开无法控制_MySQL不能启动和停止 MySQL各种解决方法教程
- java.security.NoSuchAlgorithmException: SHA_256 MessageDigest not available
- Marlin Protocol正在为验证者开放OTC渠道
- BaaS API 设计规范
- 为informix数据库中的表创建同义词
- python下载安装requests库
- 硬盘数据恢复方法 固态硬盘数据恢复方法
- 递归方式计算一个数的几次方
- DOM drag 事件
- win10调整鼠标滚轮方向
- 【游戏客户端】制作节奏大师Like音游(下)
- 爱奇艺网络流量分析引擎 QNSM 及其应用
- 王者怎么看微信以前玩过的服务器,王者荣耀如何查看微信帐号在那个区玩过
- 简单的链表封装(类)
- 计算机数据表格展示,利用工具,一分钟完成数据可视化,快速输出美观的数据图表...
- 软件测试人员能力矩阵
- Dva + React + Mock 搭建项目 (主要讲解DvaJs)
- 维基百科没有告诉你关于宝马的什么
热门文章
- bug:did not call finish() prior to onResume() completing at android.app.Activity.performResu
- 985高校的毕业生年薪大概有多少?看完你还会不努力读书吗
- UI设计薪资水涨船高,你是否适合学习呢?
- excel二进制移位运算_位运算-秦斌的博客-51CTO博客
- python微信库we_python微信库we_python操作微信客户端:WechatPCAPI库实现自动化回复...
- 来者如临高山,往者以观逝水--天猫品牌推荐算法比赛总结
- java+mysql基于SSM共享型汽车租赁系统
- 【元胞自动机】基于元胞自动机模拟3D森林火灾模型含Matlab源码
- nginx 压缩json
- iPhone 5s2G变4G