Oracle截取字符串函数function

本文介绍了两个用于在 Oracle 数据库中分割字符串的 SQL 函数。第一个函数 split 返回一个表类型,该表包含由指定分隔符拆分的字符串元素。第二个函数 splitStr 返回指定位置的子字符串。两个函数都提供了使用示例。

1.

CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ',')
RETURN tabletype
PIPELINED
/**************************************
* Name: split
* Author: Zyj.
* Date: 2016-12-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为12的两行数据。
**************************************/
IS
l_idx PLS_INTEGER;
v_list VARCHAR2 (4000) := 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;

2.

CREATE OR REPLACE TYPE "TABLETYPE" as table of VARCHAR2(4000);

3.

create or replace function splitStr(str in clob,
                                    i  in number := 0,
                                    sep in varchar2 := ',') return varchar2 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 /**
  @author ZYJ 2016-06-12 截取字符串
  ex:splitStr('2016-05',1,'-') return 2016;
  */;
Oracle中,有多种用于分割字符的函数,以下是几种常见的实现方式: ### 方式一:使用自定义类型和函数`splitstr` ```sql 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; ``` 该函数通过循环和`INSTR`函数定位分隔符位置,使用`SUBSTR`函数截取字符串,并通过`PIPE ROW`返回结果[^1]。 ### 方式二:使用函数`FUN_SPLITSTR` ```sql CREATE OR REPLACE FUNCTION FUN_SPLITSTR(str varchar2, splitchart varchar2, num number) RETURN varchar2 IS o1 number:=0; o2 number:=0; rt varchar2(100):=''; BEGIN IF instr(str, splitchart, 1, 1)=0 AND num=1 THEN RETURN(str); END IF; -- 此处原代码未完整实现逻辑 END; ``` 该函数尝试根据分隔符和指定序号返回分割后的子字符串,但原代码逻辑未完整实现[^2]。 ### 方式三:使用函数`my_split` ```sql -- 将字符串分割成数组 FUNCTION my_split(piv_str IN VARCHAR2, piv_delimiter IN VARCHAR2) -- piv_str 为字符串,piv_delimiter 为分隔符 RETURN mytype IS j INT := 0; i INT := 1; len INT := 0; len1 INT := 0; str VARCHAR2(4000); my_split mytype := mytype(); BEGIN len := LENGTH(piv_str); len1 := LENGTH(piv_delimiter); WHILE j < len LOOP j := INSTR(piv_str, piv_delimiter, i); IF j = 0 THEN j := len; str := SUBSTR(piv_str, i); my_split.EXTEND; my_split(my_split.COUNT) := str; IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR(piv_str, i, j - i); i := j + len1; my_split.EXTEND; my_split(my_split.COUNT) := str; END IF; END LOOP; RETURN my_split; END my_split; ``` 该函数通过循环和`INSTR`函数定位分隔符位置,使用`SUBSTR`函数截取字符串,并将结果存储在自定义类型数组中返回[^3]。 ### 方式四:使用函数`SPLIT` ```sql CREATE OR REPLACE FUNCTION SPLIT(SRC VARCHAR2, DELIMITER VARCHAR2) RETURN MYTABLE IS PSRC VARCHAR2(500); A MYTABLE := MYTABLE(); I NUMBER := 1; J NUMBER := 1; BEGIN PSRC := RTRIM(LTRIM(SRC, DELIMITER), DELIMITER); LOOP I := INSTR(PSRC, DELIMITER, J); IF I > 0 THEN A.EXTEND; A(A.COUNT) := TRIM(SUBSTR(PSRC, J, I - J)); J := I + 1; END IF; EXIT WHEN I = 0; END LOOP; IF J < LENGTH(PSRC) THEN A.EXTEND; A(A.COUNT) := TRIM(SUBSTR(PSRC, J, LENGTH(PSRC) + 1 - J)); END IF; RETURN A; END; ``` 该函数先去除字符串首尾的分隔符,然后通过循环和`INSTR`函数定位分隔符位置,使用`SUBSTR`函数截取字符串,并将结果存储在自定义类型数组中返回[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值