Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将缩写字符串传输到详细信息sql_Sql_Oracle_Oracle Analytics - Fatal编程技术网

将缩写字符串传输到详细信息sql

将缩写字符串传输到详细信息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实现吗

我有一个表,它有两个字符串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实现吗


提前谢谢

您的数据结构非常非常糟糕。我建议您将其更改为每个用户和每个活动一行,以及一个活动表。这是一个更典型的规范化数据模型,更适合于关系数据库

但是,你可以这样做:

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