2016-04-09 12 views
0

私は2つの文字列user_idとuser_activities_typeを持つテーブルを持っています。 exp。 user_activities_typeで詳細情報への省略形文字列の転送sql

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

すべての単語は、それが

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

のように自身の意味のしている私が欲しい結果が

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

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

ありがとうございます!

+0

はい、あります。活動の種類の意味は...それは第二のテーブルにありますか? (もしそうでなければ、どのように各コードが何を意味するのかをどうやって知っていますか?)また、すべての活動の意味は同じ形式で、「zzzレッスンを取る」と言います。あるいは、「テイク」と「レッスン」が理解されており、表には「数学」、「英語」などしか表示されていませんか?最後に、23Lのようなコードの順番は意味がありますか?文字列内の単語が2、3、Lと同じ順番になるようにしますか? – mathguy

+0

はい、詳細な意味は別のテーブルにあり、テーブルのストロークデータは '3'、 '英語' 'L'、 '化学' –

+0

などです。また、これは非常に欠陥のあるデータモデルです。私が何を意味するのかわからない場合は、「First Normal Form」(google) – mathguy

答えて

0

本当に本当に本当にひどいデータ構造です。私はあなたが1つの行と1つのアクティビティにつき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; 

EDIT:

メールで送信。私はこれがオラクルであることを知らなかった。

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; 
+0

あなたは精巧? – mathguy

+0

なぜsubstr(...、2)を使用しましたか? –

+0

の@sql_dummyです。 。 。最初の文字をスキップする。 –

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 
+0

ありがとう、私が見た中で最も素晴らしいコードです。素晴らしいOracleの機能。しかし、私のデータベースとしてNetezzaを使用しているのは残念です。 –

+0

??あなたの質問に「Oracle」とタグを付けるのは誰ですか?申し訳ありませんが、私はNetezzaに慣れていません。あなたの質問に正しくタグを付けると、おそらくあなたは必要な助けを得るでしょう。 – mathguy

関連する問題