2017-02-21 53 views
-3

我有一個逗號分隔列表作爲PL/SQL過程中的字符串。我需要PL/SQL逗號分隔列表;刪除dups並放入數組

  1. 刪除重複
  2. 放入數組列表。

我發現有多種方法可以做,但不是兩種。 有什麼幫助嗎?

+3

如果你知道如何做每個部分,爲什麼它是一個問題,你把它們合併在一起? –

+0

Atleast試一試併發布你的嘗試。 – XING

+0

問題是刪除重複的方法似乎有點不可靠。在運行這些例子時,一些根本不工作,給出錯誤的集合或留下逗號。 (我想我可以消除。)他們中的大多數使用一種形式或另一種陣列從列表到數組,但這些數組類型不利於重複刪除技術。謝謝! –

回答

1

將逗號分隔列表變成行是有一個衆所周知的SQL技巧。只需使用該技巧,將一個DISTINCT關鍵字和BULK COLLECT結果添加到您的數組中(我假定您的意思是收集)。

DECLARE 
    p_test_string VARCHAR2 (4000) := 'A,B,C,B,B,D'; 

    TYPE string_array_type IS TABLE OF VARCHAR2 (4000); 

    l_array   string_array_type; 
BEGIN 
    SELECT DISTINCT REGEXP_SUBSTR (p_test_string, 
         '[^,]+', 
         1, 
         LEVEL) 
    BULK COLLECT INTO l_array 
    FROM DUAL 
    CONNECT BY REGEXP_SUBSTR (p_test_string, 
          '[^,]+', 
          1, 
          LEVEL) 
       IS NOT NULL 
    ORDER BY 1; 

    DBMS_OUTPUT.put_line ('l_array.count = ' || l_array.COUNT); 
    DBMS_OUTPUT.put_line ('l_array(2) = ' || l_array (2)); 
END; 

輸出:

l_array.count = 4 
l_array(2) = B 
+0

非常感謝!成功了!不要松雞(確定一點),有些人比我更懂得創建一個好的字符串包,比如重複刪除等等。 –

+0

如果你想把它變成一個圖書館,爲了廣泛使用,你應該實現MT0的解決方案(我會贊成)。他是正確的,一個純粹的PL/SQL方法會更快(可能快20-30倍)。如果你只是多次調用這個,我會贊成我發佈的簡單方法。如果你打電話給這百萬次,或者正在把它變成一個圖書館,我會喜歡MT0的解決方案。 –

1

有多種方法來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')