2011-08-02 5 views
6

私は複雑な要件があると思います。Oracleの文字列組み合わせ置換

これは、Oracle 10.2を使用したコンビナトリアル・パーミュテーションであり、デカルト結合を使用して解決することができましたが、シンプルで柔軟性を高めるためにはいくつかの改善が必要だと思います。

主な動作。

入力文字列: '1 2つの'

出力: '1' '2' '1 2' '2 1' 私が制限されてきた私の解決策については

文字列の数は5になります(出力は階乗に近い数値です)。

SQL:

with My_Input_String as (select 1 as str_id, 'alpha beta omega gama' as str from dual) 

--------logic------- 

, String_Parse as (
        SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, ROWNUM) str 
        FROM My_Input_String 
        where rownum < 6 -- string limitation -- 
        CONNECT BY level <= LENGTH(REGEXP_REPLACE(str, '([^ ])+|.', '\1')) 
       )  

--------CRAP select need refactoring------- 

select str from String_Parse 
union 
select REGEXP_REPLACE(trim(s1.str||' '||s2.str||' '||s3.str||' '||s4.str||' '||s5.str), '(){2,}', ' ') as str 
from 

(select str from String_Parse union select ' ' from dual) s1, 
(select str from String_Parse union select ' ' from dual) s2, 
(select str from String_Parse union select ' ' from dual) s3, 
(select str from String_Parse union select ' ' from dual) s4, 
(select str from String_Parse union select '  ' from dual) s5 
where 
-- 
s1.str <> s2.str and s1.str <> s3.str and s1.str <> s4.str and s1.str <> s5.str 
-- 
and s2.str <> s3.str and s2.str <> s4.str and s2.str <> s5.str 
-- 
and s3.str <> s4.str and s3.str <> s5.str 
-- 
and s4.str <> s5.str 
+2

SQLでなければならないのですか?plsqlも使用できますか? – Rene

+1

固定数の文字列要素を使用しますか?変化する可能性がある場合は、PL/SQLのルートを回避する方法がわかりません。 「フレキシブル」という言葉を使用することは、あなたが考えていることを示唆しています。 – APC

+0

はい、plsqlを使用して実行できます。文字列要素の数に関しては – Metl

答えて

8

編集:一般的なものを取得しました。本当に最後に、単純な(しかし、そこに私にしばらく時間がかかった)

WITH words AS 
( SELECT REGEXP_SUBSTR('&txt', '\S+', 1, LEVEL) AS word 
     , LEVEL          AS num 
    FROM DUAL 
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE('&txt', '\S+\s*', 'X')) 
) 
SELECT SYS_CONNECT_BY_PATH(W.word, ' ') 
FROM words W 
CONNECT BY NOCYCLE PRIOR W.num != W.num 

EDIT2:削除冗長MAXNUMのもの。以前の試行から残っています

+0

素晴らしいソリューション、ちょうど私が必要なもの! – Metl

+0

本当に良いアイデア – josephj1989

関連する問題