您的当前位置:首页正文

Oracle 创建 split 和 splitstr 函数

2023-11-08 来源:骅佗教育

select  split(‘a,b,c,e,d,f,g‘)  arrData  from  dual;

默认使用逗号分割,可以自定义修改,如:select split(‘X-rapido & Lemon‘,‘&‘) arrData from dual;

技术分享

点开集合

技术分享

默认使用逗号分割,可以自定义修改,如:select split(‘X-rapido & Lemon‘,‘&‘) arrData from dual;

示例:splitstr(字符串,获取的节点下标,分隔符)

select splitstr(‘X-rapido&Lemon&Jennifer‘, 1, ‘&‘) word from dual;  -- X-rapidoselect splitstr(‘X-rapido&Lemon&Jennifer‘, 2, ‘&‘) word from dual;  -- Lemonselect splitstr(‘X-rapido&Lemon&Jennifer‘, 3, ‘&‘) word from dual;  -- Jenniferselect splitstr(‘X-rapido&Lemon&Jennifer‘, 4, ‘&‘) word from dual;  -- 空字符串

http://www.cnblogs.com/enjoycode/archive/2012/11/10/oracle_split.html

Oracle 创建 split 和 splitstr 函数

标签:oracle   splitstr   split   分割   

小编还为您整理了以下内容,可能对您也有帮助:

Oracle按指定字符拆分字符串-split函数

create or replace type strArray as table of varchar2(4020)

--此方法只能使用英文半角逗号(,)

create or replace function f_split(instr IN VARCHAR2) return strArray

as

  l_tablen BINARY_INTEGER;

  l_tab    DBMS_UTILITY.uncl_array;

  l_ret strArray:=strArray();

BEGIN

  DBMS_UTILITY.comma_to_table(instr, l_tablen, l_tab);

  FOR i IN 1 .. l_tablen LOOP

    l_ret.EXTEND(1);

    l_ret(i):=l_tab(i);

  END LOOP;

  return l_ret;

END;

select t.column_value as value from table(f_split('a,b,付')) t;

create or replace type strArray as table of varchar2(4020)

CREATE OR REPLACE FUNCTION f_split(p_str IN VARCHAR2, p_delimiter IN VARCHAR2)

      RETURN strArray IS

      TYPE ret_cur IS REF CURSOR;

      ret_cur1 ret_cur;

      g_str strarray:=strarray();

      l_sql varchar2(500):='';

    BEGIN

      l_sql :='SELECT REGEXP_SUBSTR ('''||p_str||''',''[^'||p_delimiter||']+'',1,LEVEL) as valuesa

                FROM DUAL

                CONNECT BY REGEXP_SUBSTR ('''||p_str||''',''[^'||p_delimiter||']+'',1,LEVEL) IS NOT NULL';

      OPEN ret_cur1 FOR l_sql ;

      FETCH ret_cur1 BULK COLLECT INTO g_str;

      CLOSE ret_cur1;

      RETURN g_str;

    END f_split;

select * from table(f_split('abc$d$e$','$') );

如何在oracle中使用类似split函数分割字符串

(1)定义split_type类型:

CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (4000) /(2)定义split函数:

CREATE OR REPLACE FUNCTION split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN split_type IS j INT := 0; i INT := 1; len INT := 0; len1 INT := 0; str VARCHAR2 (4000); my_split split_type := split_type (); 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); my_split.EXTEND; my_split (my_split.COUNT) := str; IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR (p_str, i, j - i); i := j + len1; my_split.EXTEND; my_split (my_split.COUNT) := str; END IF; END LOOP; RETURN my_split; END split; /(3)存储过程中,使用类似

For T In ( select a,b,c,d from table (split('1,2,3,4',',')) ) Loop--注意下面的inserti语句,varchar类型的值需要补充引号上去Execute Immediate ' insert into tableName set fieldName = '||T.a ;Execute Immediate 'commit';

End Loop;

的查询语句,把分开的结果拼成sql语句并写入到表中。

【oracle】:字符串分割的函数讲解

-- 定义一个对象类型.

CREATE OR REPLACE TYPE ty_row_str_split as object (strValue VARCHAR2 (4000));

/

-- 定义一个 表/数组类型, 内容是前面定义的那个对象.

CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split;

/

--------------------

-- 字符分割函数.

-- 参数1:  被分割的源字符串

-- 参数2:  用于拆分的字符串。

--------------------

CREATE OR REPLACE FUNCTION fn_split(

  p_str       IN VARCHAR2,

  p_delimiter IN VARCHAR2)

RETURN ty_tbl_str_split IS

  j         INT := 0;

  i         INT := 1;

  -- 被分割的源字符串 的长度.

  len       INT := 0;

  -- 分隔字符串的长度

  len1      INT := 0;

  -- 暂存的中间每一个单元的文本信息.

  str       VARCHAR2(4000);

  -- 预期返回结果.

  str_split ty_tbl_str_split := ty_tbl_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=0 意味着没有找到.

  -- 可以理解为是查询到最后一个单元了.

  -- 设置 j := len, 让外部的循环处理可以结束了.

      j  := len;

      -- 获取最后一个单元的内容.

      str := SUBSTR(p_str, i);

      -- 结果追加一行.

      str_split.EXTEND;

      -- 设置结果内容.

      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

      IF i >= len THEN

        EXIT;

      END IF;

    ELSE

      -- 如果在被分割的源字符串中,找到了 分隔字符串.

      -- 首先,获取分割的内容.

      str := SUBSTR(p_str, i, j - i);

      -- 然后设置索引, 下一次再查找的时候,从指定的索引位置开始(不是从0开始找了)

      i := j + len1;

      -- 结果追加一行.

      str_split.EXTEND;

      -- 设置结果内容.

      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

    END IF;

  END LOOP;

  RETURN str_split;

END fn_split;

/

函数创建完毕以后,可以开始做查询的处理.

SQL> select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','));

VALUE

-------------------------------------------------------------------------------

aa

bb

cc

oracle 如何用sql实现split功能

本函数可以将“目标字符串”以“指定字符串”进行拆分,并通过表结构返回结果。代码如下:

 

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 * from table(splitstr('Hello,Cnblogs!',','));

其输出结果为一个两行的表,如下图: