将缩写字符串传输到详细信息sql
我有一个表,它有两个字符串user\u id和user\u activities\u type。 经验 用户活动类型中的每个单词都有自己的含义,如将缩写字符串传输到详细信息sql,sql,oracle,oracle-analytics,Sql,Oracle,Oracle Analytics,我有一个表,它有两个字符串user\u id和user\u activities\u type。 经验 用户活动类型中的每个单词都有自己的含义,如 2-> take math lessons 3 -> take english lessons L -> take chemical lessons 我想要的结果是 'John' ,'math,english,chemical' 'Mike','history,english,painting' 还有什么方法可以通过sql实现吗
2-> take math lessons
3 -> take english lessons
L -> take chemical lessons
我想要的结果是
'John' ,'math,english,chemical'
'Mike','history,english,painting'
还有什么方法可以通过sql实现吗
提前谢谢 您的数据结构非常非常糟糕。我建议您将其更改为每个用户和每个活动一行,以及一个活动表。这是一个更典型的规范化数据模型,更适合于关系数据库 但是,你可以这样做:
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;
表:
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
/
是的,有。活动类型的含义。。。那是在第二张桌子上吗?(如果不是,你怎么知道每个代码的意思呢?)另外,所有活动的含义都是相同的格式,“take zzz lessons”,你只想使用中间的单词吗?或者“学习”和“课程”理解了吗,表格上只显示“数学”、“英语”等。?最后,23L中的代码顺序是否有意义?您希望字符串中的单词的顺序与2、3、L相同吗?是的,详细含义在另一个表中,表中的数据是'3','english','L','chemical',而且,您意识到这是一个非常有缺陷的数据模型,对吗?如果你不知道我的意思,请阅读“第一范式”(谷歌)对不起…表格已经存在很长时间了,我现在必须以这种方式获取数据不知道这意味着什么-你能详细说明吗?你为什么使用substr(…,2);for@sql_dummy . . . 跳过第一个字符。说真的,这是怎么回事?您将如何处理长度可变、甚至长度事先未知的用户\u活动\u类型字符串?当然。。。这不是你的答案。@mathguy。它查找代码,并为每个匹配的代码输入扩展名称。它不保留值的原始顺序,但应该为
user\u activities\u type
中的每个代码添加扩展名。非常感谢,这是我见过的最令人惊奇的代码。惊人的甲骨文功能。但我使用Netezza作为我的数据库真是太遗憾了。??那么谁把你的问题标记为“甲骨文”?对不起,我不熟悉Netezza;如果你的问题标记正确,也许你会得到你需要的帮助。
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