0

user_id と user_activities_type の 2 つの文字列を持つテーブルがあります。指数

'John',   '23Lqv'
'Mike', '159pLv3'

user_activities_type のすべての単語には、次のような独自の意味があります

2-> take math lessons
3 -> take english lessons
L -> take chemical lessons

私が望む結果は

'John' ,'math,english,chemical'
'Mike','history,english,painting'

とにかくSQLでそれを作ることはありますか?

前もって感謝します!

4

2 に答える 2

0

テーブル:

users

    USER ACTIVITY_TYPE
    ---- ---------------
    John 23L
    Mike 159

activities

    ACTIVITY_CODE        DESCRIPTION
    -------------------- --------------------
    1                    music
    2                    math
    3                    english
    5                    physics
    9                    french
    L                    chemistry

クエリ:

select user_id, listagg(description, ',') within group (order by rk) as activities_list
from (select user_id, rk, description from users u join 
         (select rownum rk from all_tables) r on r.rk <= length(activity_type)
         join activities a on a.activity_code = substr(u.activity_type, rk, 1)  )
group by user_id
/

結果:

USER ACTIVITIES_LIST
---- --------------------------------------------------
John math,english,chemistry
Mike music,physics,french
于 2016-04-09T03:23:22.223 に答える
0

あなたは本当に、本当に、本当にお粗末なデータ構造を持っています。アクティビティ テーブルと共に、ユーザーごと、アクティビティごとに 1 行に変更することをお勧めします。これはより一般的な正規化されたデータ モデルであり、リレーショナル データベースにより適しています。

しかし、あなたはできる:

select user_id,
       concat_ws(',',
                 (case when user_activities_type like '%1%' then 'history' end),
                 (case when user_activities_type like '%2%' then 'math' end),
                 (case when user_activities_type like '%3%' then 'english' end),
                 . . .
                )
from t;

編集:

おっと。これがオラクルだとは知りませんでした。

select user_id,
       substr(',' || (case when user_activities_type like '%1%' then 'history' end) ||
              ',' || (case when user_activities_type like '%2%' then 'math' end) ||
              ',' || (case when user_activities_type like '%3%' then 'english' end)
                 . . .
               2)
from t;
于 2016-04-09T03:03:25.800 に答える