好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle字符串拆分实例详解

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

查看更多关于Oracle字符串拆分实例详解的详细内容...

  阅读:34次