Oracle PL/SQL逗号分隔列表;移除DUP并放入阵列

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

在PL/SQL过程中,我有一个逗号分隔的列表作为字符串。我需要

  • 删除重复项
  • 将列表放入数组中
  • 我已经找到了多种方法,但不是两种都能做到。
    有什么帮助吗?

    有一个众所周知的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' )