2016-03-21 7 views
0

oracle pl/sqlでvarchar変数の一意の値を取得するにはどうすればよいですか? は、私はこのような変数があります:私はまだで区切られた一意の値を取得したいと思いoracle pl/sqlでvarchar変数のuniqe値を取得する方法

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

を「;」。 希望の結果:

aa;bb;cc;dd;ee 

これは可能ですか?ありがとう。

+2

(SSV、セミコロン区切り)形式、それはあなたが結果を照会助けるためにあなたのデータベースは無力レンダリングするため。だから私はあなたのデータベースデザインを変更するために投票します。 –

答えて

3

最初split your string、重複をフィルタリングし、(SQL Fiddleでの例)LISTAGGを使用して、再びそれを組み合わせるためにDISTINCTを使用することができます。

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 
); 

これは、Oracle 11gの場合には
aa;bb;cc;dd;ee

1

を返し、それ以上、あなたはこの

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を使用することによって、これを達成することができます。 下記のスニペットをご覧ください。お役に立てれば。これは可能ではあるが、それはCSVにデータを保存するために、まったく本当に望ましくない

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

関連する問題