Oracle字符串拆分
比如把一列 a,b,c 拆分为
a
b
c
1. 使用regexp_substr()函数
1.1 拆分aaa,bbb,ccc
1 2 3 4 5 6 |
SELECT regexp_substr( 'aaa,bbb,ccc' , '[^,]+' , 1, LEVEL ) FROM dual CONNECT BY LEVEL <= LENGTH( 'aaa,bbb,ccc' )-LENGTH( REPLACE ( 'aaa,bbb,ccc' , ',' ))+ 1; |
输出结果:
1.2 拆分aaa;bbb;ccc
1 2 3 4 5 6 |
SELECT regexp_substr( 'aaa;bbb;ccc' , '[^;]+' , 1, LEVEL ) FROM dual CONNECT BY LEVEL <= LENGTH( 'aaa;bbb;ccc' )-LENGTH( REPLACE ( 'aaa;bbb;ccc' , ';' ))+ 1; |
1.3 level作用
1 |
SELECT LEVEL FROM dual CONNECT BY LEVEL <10; |
2. 在oracle中实现MySQL的find_in_set()函数
2.1 使用oracle的函数定义函数FIND_IN_SET()
FIND_IN_SET(str,strlist)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',' ) RETURN NUMBER IS l_idx number:=0; str varchar2(500); piv_str varchar2(500) := piv_str2; res number:=0; loopIndex number:=0; BEGIN IF instr(piv_str, p_sep, 1) = 0 THEN IF piv_str = piv_str1 THEN res:= 1; END IF; ELSE LOOP l_idx := instr(piv_str,p_sep); loopIndex:=loopIndex+1; IF l_idx > 0 THEN str:= substr(piv_str,1,l_idx-1); IF str = piv_str1 THEN res:= loopIndex; EXIT; END IF; piv_str := substr(piv_str,l_idx+length(p_sep)); ELSE IF piv_str = piv_str1 THEN res:= loopIndex; END IF; EXIT; END IF; END LOOP; END IF; RETURN res; END FIND_IN_SET; |
2.2 使用FIND_IN_SET()
查看aaa是否在aaa,bbb,ccc中
1 |
SELECT find_in_set( 'aaa' , 'aaa,bbb,ccc' ) FROM dual; |
返回1
查看bbb是否在aaa,bbb,ccc中
1 |
SELECT find_in_set( 'bbb' , 'aaa,bbb,ccc' ) FROM dual; |
返回2
查看ddd是否在aaa,bbb,ccc中
1 |
SELECT find_in_set( 'ddd' , 'aaa,bbb,ccc' ) FROM dual; |
返回0
2.3 删除函数FIND_IN_SET()
1 |
DROP FUNCTION FIND_IN_SET; |
3. 使用存储过程输入aaa,bbb,ccc,拆分打印出来
3.1 定义存储过程
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE OR REPLACE PROCEDURE SPLIT_STR(STRLIST IN VARCHAR2) IS CURSOR CHECK_FLAG IS SELECT REGEXP_SUBSTR(STRLIST, '[^,]+' , 1, LEVEL ) F_VALUE FROM DUAL CONNECT BY LEVEL <= LENGTH(STRLIST) - LENGTH( REPLACE (STRLIST, ',' )) + 1; BEGIN FOR REC IN CHECK_FLAG LOOP DBMS_OUTPUT.PUT_LINE(REC.F_VALUE); END LOOP; END SPLIT_STR; |
3.2 使用块执行存储过程
1 2 3 4 |
DECLARE BEGIN SPLIT_STR( 'aaa,bbb,ccc' ); END ; |
执行结果:
3.3 删除存储过程
1 |
DROP PROCEDURE SPLIT_STR; |
总结
到此这篇关于Oracle字符串拆分的文章就介绍到这了,更多相关Oracle字符串拆分内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/stormkai/article/details/125775055