如何在oracle pl/sql中獲取一個varchar變量的唯一值? 我有這樣一個變量:如何在oracle中獲取一個varchar變量的唯一值pl/sql
aa;bb;aa;cc;dd;ee;dd
我想獲得通過仍分開特有的價值觀「;」。 預期結果:
aa;bb;cc;dd;ee
這可能嗎?謝謝。
如何在oracle pl/sql中獲取一個varchar變量的唯一值? 我有這樣一個變量:如何在oracle中獲取一個varchar變量的唯一值pl/sql
aa;bb;aa;cc;dd;ee;dd
我想獲得通過仍分開特有的價值觀「;」。 預期結果:
aa;bb;cc;dd;ee
這可能嗎?謝謝。
您可以先使用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
在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)
和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
您可以輕鬆地通過使用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;
請不要使用wm_concat。它只支持逗號作爲分隔符,而OP需要分號。這是一個未公開的函數,僅供oracle [內部](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1336219.1)使用。最重要的是,它在12c中停用。 – ruudvan
雖然這是可能的,這真的不希望在所有存儲你的數據在CSV(SSV,分號分隔值)格式,因爲它使你的數據庫無力幫你查詢結果。所以我投票改變你的數據庫設計。 –