2016-03-21 70 views
0

如何在oracle pl/sql中獲取一個varchar變量的唯一值? 我有這樣一個變量:如何在oracle中獲取一個varchar變量的唯一值pl/sql

aa;bb;aa;cc;dd;ee;dd 

我想獲得通過仍分開特有的價值觀「;」。 預期結果:

aa;bb;cc;dd;ee 

這可能嗎?謝謝。

+2

雖然這是可能的,這真的不希望在所有存儲你的數據在CSV(SSV,分號分隔值)格式,因爲它使你的數據庫無力幫你查詢結果。所以我投票改變你的數據庫設計。 –

回答

3

您可以先使用split your string,使用DISTINCT過濾重複項並使用LISTAGG(示例爲SQL Fiddle)再次合併。

SELECT LISTAGG(x, ';') WITHIN GROUP(ORDER BY x) 
FROM (
    SELECT DISTINCT regexp_substr('aa;bb;aa;cc;dd;ee;dd', '[^;]+', 1, LEVEL) AS x 
    FROM dual 
    CONNECT BY regexp_substr('aa;bb;aa;cc;dd;ee;dd', '[^;]+', 1, LEVEL) IS NOT NULL 
); 

這將返回
aa;bb;cc;dd;ee

1

在Oracle 11g中的情況下,和更大的,你可以使用這個

SELECT listagg(val,';') WITHin GROUP(ORDER BY NULL) 
FROM 
(SELECT DISTINCT REGEXP_SUBSTR('aa;bb;aa;cc;dd;ee;dd', '[^;]+', 1, LEVEL) val 
    FROM dual 
CONNECT BY REGEXP_SUBSTR('aa;bb;aa;cc;dd;ee;dd', '[^;]+', 1, LEVEL) IS NOT NULL) 
1

和XMLQUERY。

select xmlcast(xmlquery('let $i := string-join(distinct-values(ora:tokenize($doc,";")),";") return $i' passing 'aa;bb;aa;cc;dd;ee;dd' as "doc" returning content) as varchar2(4000)) from dual 
0

您可以輕鬆地通過使用REGEXP和WMSYS.WM_CONCAT(甚至 但其未公開的函數)或LISTAGG以韭菜此實現這一目標。請 見下面的片段。希望這可以幫助。

SELECT wm_concat(DISTINCT regexp_substr('aa;bb;aa;cc;dd;ee;dd','[^;]+', 1, level)) 
FROM dual 
    CONNECT BY regexp_substr('aa;bb;aa;cc;dd;ee;dd', '[^;]+', 1, level) IS NOT NULL; 
+1

請不要使用wm_concat。它只支持逗號作爲分隔符,而OP需要分號。這是一個未公開的函數,僅供oracle [內部](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1336219.1)使用。最重要的是,它在12c中停用。 – ruudvan

相關問題