2016-04-09 18 views
0

İki string user_id ve user_activities_type içeren bir tablom var. exp.transfer kısaltma dizesini ayrıntılı bilgi için sql

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

user_activities_type her kelime vardır o

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

gibi kendi anlamı ben

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

yine de var mı olduğu sql bunu yapmak istiyorum sonucudur?

Şimdiden teşekkürler!

+0

Evet, var. Faaliyet türünün anlamı ... ikinci tabloda mı? (Eğer değilse, her bir kodun ne anlama geldiğini nereden biliyorsunuz?) Ayrıca, aynı formattaki tüm aktivite anlamları, 'zzz dersleri al', ve sadece orta kelimeyi kullanmak istiyor musunuz? Veya "almak" ve "dersler" anlaşılmaktadır ve tablo sadece "matematik", "İngilizce" vb gösterir? Son olarak, kodların 23L'deki sırasının anlamı var mıdır? Dizideki kelimelerin 2, 3, L ile aynı düzeni takip etmesini ister misiniz? – mathguy

+0

Evet, detay anlamları başka bir tabloda, ve '3', 'english' 'L', 'chemical' –

+0

gibi tablodaki stroe verileridir Ayrıca, bunun çok hatalı bir veri modeli olduğunu anlıyorsunuz, değil mi? Ne demek istediğimi bilmiyorsanız, lütfen "İlk Normal Form" (google) – mathguy

cevap

0

Gerçekten çok berbat bir veri yapınız var. Bir etkinlik tablosuyla birlikte, kullanıcı başına ve etkinlik başına bir satır ile değiştirdiğinizi savunurum. Bu daha tipik bir normalleştirilmiş veri modelidir ve ilişkisel bir veritabanı için daha uygundur.

Ama yapabilirdi:

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; 

DÜZENLEME:

Hata. Bunun Oracle olduğunu bilmiyordum.

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

Bunun ne anlama geldiğinden emin değil - detaylandırıyor musun? – mathguy

+0

neden substr (..., 2) kullandınız; –

+0

için @sql_dummy. . . İlk karakteri atlamak için. –

0

Tablolar:

users 

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

activities 

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

Sorgu:

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 
/

Sonuç:

USER ACTIVITIES_LIST 
---- -------------------------------------------------- 
John math,english,chemistry 
Mike music,physics,french 
+0

Çok teşekkür ederim, gördüğüm en muhteşem kod. İnanılmaz Oracle işlevi. Ama ne yazık ki Netezza'yı veri tabanım olarak kullanıyorum. –

+0

?? Sonra sorunuzu "Oracle" olarak etiketleyen kişi kim? Üzgünüm Netezza ile aşina değilim; Sorunuzu doğru bir şekilde etiketlerseniz, belki de ihtiyacınız olan yardımı alırsınız. – mathguy

İlgili konular