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

----

1

2

3

4

5

6

7

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

----

17

20

23

NULL

NULL

NULL

NULL

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

----

17

20

23

oralce逗号分割变多行

方法一

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;

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skinchqqhah/p/10350161.html

时间: 2024-11-06 14:15:39

oralce逗号分割变多行 Oracle中REGEXP SUBSTR函数的相关文章

Oracle中的substr()函数 详解及应用

注:本文来源于<Oracle中的substr()函数 详解及应用> 1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a) ; 解释: 格式1:        1.string 需要截取的字符串         2.a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)        3.b 要截取的字符串的长度 格式2:     

db2中left()函数和right()函数对应oracle中的substr()函数

DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHAR或BINARY STRING. eg:SELECT LEFT(NAME,2),RIGHT(NAME,2) FROM T1 ORACLE substr()函数 substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H' 

Oracle中的substr()函数的应用及解析

1)substr函数格式   (俗称:截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a) ; 解释: 格式1 1.string 需要截取的字符串 2.a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)3.b 要截取的字符串的长度 格式2 1.string 需要截取的字符串2.a 可以理解为从第a个字符开始截取后面所有的字符串. 2)实例解析 实例: 1.substr(

oracle中的聚合函数count、max、min、sum、avg以及NVL函数的用法

oracle中的聚合函数count.max.min.sum.avg以及NVL函数的用法 分组函数聚合函数对一组行中的某个列执行计算执行计算并返回单一的值.聚合函数忽略空值.聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用,所以有的时候也把其称之为分组函数.这类函数通常应用于报表统计中,以下展示Oracle常用的聚合函数的应用. 分组函数的介绍 作用于一组数据,并对一组数据返回一个值. 常见的分组函数有: Count 用来计算有效数据的数量 Min 返回一个数字列或计算列的最小

Oracle中的单行函数

Oracle中的单行函数 1 字符函数 UPPER()--将字符串转换为大写 SELECT UPPER('abc') FROM dual; LOWER()-将字符串转换为小写 SELECT LOWER('ABC') FROM dual; INITCAP()-首字母大写,其它字母小写. SELECT INITCAP('hello') FROM dual; REPLACE()-将指定的字符/字符串替换 SELECT REPLACE('abcd efg','cd','XXX') FROM dual;

oracle中的trim()函数详解

1.先看一下Oracle TRIM函数的完整语法描述 TRIM([ { { LEADING | TRAILING | BOTH }[ trim_character ]| trim_character}FROM]trim_source) 以上语法引自于Oracle 10gR2官方文档:http://download.oracle.com/docs/ ... 0/img_text/trim.htm单从这个语法定义上我们就可以看出,小小的Oracle TRIM函数蕴含了更多可定制的功能.一一展示,供参

Oracle中 Instr 这个函数

http://www.jb51.net/article/42369.htm sql :charindex('字符串',字段)>0 charindex('administrator',MUserID)>0 oracle:instr(字段,'字符串',1,1) >0 instr(MUserID,'administrator',1,1)>0 在项目中用到了Oracle中 Instr 这个函数,顺便仔细的再次学习了一下这个知识. Oracle中,可以使用 Instr 函数对某个字符串进行判

问题:oracle nvl;结果:Oracle中的NVL函数

Oracle中的NVL函数 (2012-11-30 13:21:43) 转载▼ 标签: nvl oracle 分类: Oracle Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简单介绍一下几个函数的用法. 在介绍这个之前你必须明白什么是oracle中的空值null 1.NVL函数 NVL函数的格式如下:NVL(expr1,expr2) 含义是:

Oracle 中的replace函数的应用

replace 函数用法如下: replace('将要更改的字符串','被替换掉的字符串','替换字符串') oracle 中chr()函数 CHR() --将ASCII码转换为字符 语法CHR(number_code)示例select CHR(116) from dual;  --返回't' 几个常用的chr()函数:chr(9) --制表符chr(10) --换行符chr(13) --回车符chr(32) --空格符chr(34) --双引号“"” 例:replace('111<br/