split a delimited string 有多种方法。其中之一是使用简单的 PL/SQL 函数:
CREATE TYPE string_list IS TABLE OF VARCHAR2(4000);
/
CREATE OR REPLACE FUNCTION split_String(
i_str IN VARCHAR2,
i_delim IN VARCHAR2 DEFAULT ','
) RETURN STRING_LIST DETERMINISTIC
AS
p_result STRING_LIST := STRING_LIST();
p_start NUMBER(5) := 1;
p_end NUMBER(5);
c_len CONSTANT NUMBER(5) := LENGTH( i_str );
c_ld CONSTANT NUMBER(5) := LENGTH( i_delim );
BEGIN
IF c_len > 0 THEN
p_end := INSTR( i_str, i_delim, p_start );
WHILE p_end > 0 LOOP
p_result.EXTEND;
p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, p_end - p_start );
p_start := p_end + c_ld;
p_end := INSTR( i_str, i_delim, p_start );
END LOOP;
IF p_start <= c_len + 1 THEN
p_result.EXTEND;
p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, c_len - p_start + 1 );
END IF;
END IF;
RETURN p_result;
END;
/
这是一个使用简单字符串函数的纯 PL/SQL 函数(而不是使用更昂贵的正则表达式和上下文切换到 SQL 范围)。
还有一个非常简单的内置函数 SET( collection_value ) 用于从集合中删除重复项:
SET( STRING_LIST( 'A', 'B', 'A', 'C', 'B' ) )
会赠送收藏:
STRING_LIST( 'A', 'B', 'C' )
因此,如果您想拆分分隔字符串并对其进行重复数据删除,那么您可以这样做:
SET( split_String( 'A,B,C,A,B,D,C,E' ) )
这会给你:
STRING_LIST( 'A', 'B', 'C', 'D', 'E' )