Oracle使用split和splitstr函數批量分隔字符串


 /*
  * Oracle 創建 split 和 splitstr 函數
  */
 
 /* 創建一個表類型 */
 create or replace type tabletype as table of VARCHAR2(32676)
 /
 
 /* 創建 split 函數 */
 CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ',')
    RETURN tabletype
    PIPELINED
 /**************************************
  * Name:        split
  * Author:      Sean Zhang.
  * Date:        2012-09-03.
  * Function:    返回字符串被指定字符分割后的表類型。
  * Parameters:  p_list: 待分割的字符串。
                 p_sep: 分隔符,默認逗號,也可以指定字符或字符串。
  * Example:     SELECT *
                   FROM users
                  WHERE u_id IN (SELECT COLUMN_VALUE
                                   FROM table (split ('1,2')))
                 返回u_id為1和2的兩行數據。
  **************************************/
 IS
    l_idx    PLS_INTEGER;
    v_list   VARCHAR2 (32676) := p_list;
 BEGIN
    LOOP
       l_idx   := INSTR (v_list, p_sep);
 
       IF l_idx > 0
       THEN
          PIPE ROW (SUBSTR (v_list, 1, l_idx - 1));
          v_list   := SUBSTR (v_list, l_idx + LENGTH (p_sep));
       ELSE
          PIPE ROW (v_list);
          EXIT;
       END IF;
    END LOOP;
 END;
 /
 
 /* 創建 splitstr 函數 */
 CREATE OR REPLACE FUNCTION splitstr (str IN CLOB,
                                        i   IN NUMBER := 0,
                                        sep IN VARCHAR2 := ','
 )
    RETURN VARCHAR2
 /**************************************
  * Name:        splitstr
  * Author:      Sean Zhang.
  * Date:        2012-09-03.
  * Function:    返回字符串被指定字符分割后的指定節點字符串。
  * Parameters:  str: 待分割的字符串。
                 i: 返回第幾個節點。當i為0返回str中的所有字符,當i 超過可被分割的個數時返回空。
                 sep: 分隔符,默認逗號,也可以指定字符或字符串。當指定的分隔符不存在於str中時返回sep中的字符。
  * Example:     select splitstr('abc,def', 1) as str from dual;  得到 abc
                 select splitstr('abc,def', 3) as str from dual;  得到 空
  **************************************/
 IS
    t_i       NUMBER;
    t_count   NUMBER;
    t_str     VARCHAR2 (4000);
 BEGIN
    IF i = 0
    THEN
       t_str   := str;
    ELSIF INSTR (str, sep) = 0
    THEN
       t_str   := sep;
    ELSE
       SELECT COUNT ( * )
       INTO t_count
       FROM table (split (str, sep));
 
       IF i <= t_count
       THEN
          SELECT str
          INTO t_str
          FROM (SELECT ROWNUM AS item, COLUMN_VALUE AS str
                FROM table (split (str, sep)))
          WHERE item = i;
       END IF;
    END IF;
 
    RETURN t_str;
 END;
 /

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM