sql >> データベース >  >> RDS >> Oracle

Oracle regexp_replaceによってスペースで区切られたリストから重複を削除するにはどうすればよいですか?

    私がよく理解している場合は、単に「、」をスペースに置き換えるだけでなく、よりスマートな方法で重複を削除する必要があります。

    '、'の代わりにスペースで機能するようにその式を変更すると、次のようになります

    select regexp_replace('A B A A C D' ,'([^ ]+)( [ ]*\1)+', '\1') from dual
    

    'A B A C D'を与えます 、必要なものではありません。

    必要な結果を得る方法は、次のようになりますが、もう少し複雑です。

    with string(s) as ( select 'A B A A C D' from dual)    
        select listagg(case when rn = 1 then str end, ' ') within group (order by lev)
        from (
                select str,  row_number() over (partition by str order by 1) rn, lev
                from (
                    SELECT trim(regexp_substr(s, '[^ ]+', 1, level)) str,
                           level as lev
                      FROM string
                    CONNECT BY instr(s, ' ', 1, level - 1) > 0
                    )
             )
    

    ここでの私の主な問題は、隣接していない重複をチェックする正規表現を作成できないことです。そのため、文字列を分割し、重複をチェックしてから、重複していない値を並べ替えて集計する必要があります。

    結果文字列内のトークンの順序を気にしない場合は、これを簡略化できます。

    with string(s) as ( select 'A B A A C D' from dual)
    select listagg(str, ' ') within group (order by 1)
    from (
            SELECT distinct trim(regexp_substr(s, '[^ ]+', 1, level)) as str
              FROM string
            CONNECT BY instr(s, ' ', 1, level - 1) > 0
         )
    


    1. 自分自身を再帰的に呼び出すmysqlストアドプロシージャ

    2. ひねりを加えたHekaton:インメモリTVP –パート3

    3. sqliteに保存されている個々の値に基づいてMPandroidChartsのバーの色を変更するにはどうすればよいですか?

    4. MySQLで主キーのインデックスが自動的に作成されますか?