Oracle PL/SQL逗号分隔列表;移除DUP并放入阵列
在PL/SQL过程中,我有一个逗号分隔的列表作为字符串。我需要Oracle PL/SQL逗号分隔列表;移除DUP并放入阵列,oracle,plsql,Oracle,Plsql,在PL/SQL过程中,我有一个逗号分隔的列表作为字符串。我需要 删除重复项 将列表放入数组中 我已经找到了多种方法,但不是两种都能做到。 有什么帮助吗?有一个众所周知的SQL技巧可以将逗号分隔的列表转换为行。只需使用这个技巧,添加一个DISTINCT关键字,然后BULK COLLECT将结果收集到数组中(我假设您指的是收集) 输出: l_array.count = 4 l_array(2) = B 有多种方法可供选择。其中之一是使用简单的PL/SQL函数: CREATE TYPE string
有什么帮助吗?有一个众所周知的SQL技巧可以将逗号分隔的列表转换为行。只需使用这个技巧,添加一个
DISTINCT
关键字,然后BULK COLLECT
将结果收集到数组中(我假设您指的是收集)
输出:
l_array.count = 4
l_array(2) = B
有多种方法可供选择。其中之一是使用简单的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;
/
将提供以下信息:
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' )
如果你知道如何做每一部分,为什么把它们组合在一起对你来说是一个问题?至少试一下,然后发布你尝试过的内容。问题是删除重复项的方法似乎有点不可靠。在运行这些示例时,有些根本不起作用,请给出错误的集合或留下逗号。(我想我可以消除这种情况。)大多数使用一种或另一种形式的数组从一个列表转到另一个数组,但这些数组类型不利于重复删除技术。谢谢多谢!工作!不要抱怨(好一点)一些比我了解得更多的人,应该创建一个好的字符串包,包括重复删除之类的东西。如果你想把它变成一个库,以便广泛使用,你应该实现MT0的解决方案(我将对此进行投票)。他说得对,纯PL/SQL方法会快得多(可能快20-30倍)。如果你只是打了几次电话,我会喜欢我发布的方法,因为它简单。如果您多次调用它,或者将其放入一个库中,我会支持MT0的解决方案。
STRING_LIST( 'A', 'B', 'C', 'D', 'E' )