回答
將逗號分隔列表變成行是有一個衆所周知的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
非常感謝!成功了!不要松雞(確定一點),有些人比我更懂得創建一個好的字符串包,比如重複刪除等等。 –
如果你想把它變成一個圖書館,爲了廣泛使用,你應該實現MT0的解決方案(我會贊成)。他是正確的,一個純粹的PL/SQL方法會更快(可能快20-30倍)。如果你只是多次調用這個,我會贊成我發佈的簡單方法。如果你打電話給這百萬次,或者正在把它變成一個圖書館,我會喜歡MT0的解決方案。 –
有多種方法來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')
- 1. 刪除逗號分隔符
- 2. 數組項的逗號分隔列表
- 3. PHP MYSQL - 搜索逗號,逗號分隔列表分隔列表
- 4. 從數據庫中刪除逗號分隔列表中的值
- 5. 逗號分隔列表使用合併
- 6. 使用合併逗號分隔列表
- 7. 將逗號分隔列表中的值從其他逗號分隔的列表中刪除
- 8. 如何加入逗號分隔列表?
- 9. 逗號分隔列表
- 10. 逗號分隔的列表
- 11. @synthesize逗號分隔列表
- 12. 數組逗號分隔?
- 13. SQL,在逗號分隔列表末尾刪除逗號的外觀
- 14. 保留值逗號,但刪除數組中的分隔符逗號
- 15. MYSQL逗號分隔列表,可能添加和刪除值?
- 16. 刪除最後一個逗號或分隔符從列表C#
- 17. 如何從JavaScript中的數組中刪除逗號分隔值?
- 18. 閱讀逗號分隔文件,並將數據放入ListView - C#
- 19. 從元組中刪除逗號列表
- 20. 追加數以逗號分隔列表
- 21. 從逗號分隔的文件中刪除額外的逗號
- 22. 將數組拆分成逗號分隔的值列表
- 23. 正則表達式從逗號分隔號分隔的列表
- 24. 如何將三個逗號分隔的參數放入表中?
- 25. 從逗號分隔的數字導入逗號分開數字
- 26. 只導入特定數據列 - 逗號分隔列表
- 27. 將逗號分隔的整數列表轉換爲數組
- 28. 以逗號分隔,製表符分隔格式組合數據
- 29. 將SQL分組爲一列中逗號分隔的值列表
- 30. SQL逗號分隔列表中的分析函數列表
如果你知道如何做每個部分,爲什麼它是一個問題,你把它們合併在一起? –
Atleast試一試併發布你的嘗試。 – XING
問題是刪除重複的方法似乎有點不可靠。在運行這些例子時,一些根本不工作,給出錯誤的集合或留下逗號。 (我想我可以消除。)他們中的大多數使用一種形式或另一種陣列從列表到數組,但這些數組類型不利於重複刪除技術。謝謝! –