在SQL语句的字符串中查找字符串

| 我有一列显示了我们公司经历的项目的标题,另一列显示了每个项目的工作时间。 项目标题包含关键字,关键字的定义格式为\'keyword:\',即\'ETL:\' 某些项目具有多个关键字,即\'客户:ETL:ASCX:\' 因此,例如,项目标题可能为“客户:ETL:ASCX:更新导入过程” 我不提前知道这些关键字。 我想要给定关键字的总小时数和项目 因此,我们以以下两个项目标题为例: 客户:ETL:ASCX:有20小时的 工作投入其中。 客户:ETL: 桥梁:投入了10个小时的工作 它。 该报告应给出:
Keyword - Total Projects - Total Hours
Client: - 2 -30
ETL: - 2 - 30
ASCX: - 1 - 20
Bridge: - 1 - 10
获取关键字的第一个实例很容易-只需子字符串即可;但是事实证明,找到嵌套关键字很困难。 可以在SQL中完成嵌套搜索吗? 有没有人? UPDATE(最初发布为\“ answer \”): 进一步的例子: 假设我有两条记录具有以下项目名称:
Record 1: Interface: ETL:
Record 2: ETL:
记录1有10个小时,记录2有30个小时。 现在,我的代码捕获了第一个关键字实例,所以我现在的输出是(关键字:小时)
ETL: 30
Interface: 10
但是,要求是要显示ETL已分配了40个小时,因为两个项目都将ETL作为关键字:
ETL: 40
Interface: 10
因此,可以肯定的是,我可以使用LIKE查找所有ETL或Interface的实例,但需要在select each关键字中进行细分。对于上面的示例,如果我使用类似\'%ETL:%\'的方法,则会同时获得两条记录,但是我想查看所有关键字的所有小时数,并按关键字细分。 也许更好的问题是: 我如何获得如下所示的记录:
Interface: ETL:
变成如下所示的输出:
Interface:
ETL:
在SQL中?     
已邀请:
        不是很漂亮,但是您可以使用
MODEL
子句进行拆分(只是一种方式)。假设您具有通过ID字段建立关系的单独的
project
project_hours
表:
create table projects as (
    select \'Client: ETL: ASCX: update the import process\' as project_title,
        1 as project_id from dual
    union all select \'Client: ETL: Bridge: something else\', 2 from dual
    --union all select \'Interface: ETL:\', 3 from dual
    --union all select \'ETL:\', 4 from dual
)
/

create table project_hours as (
    select 1 as project_id, 20 as hours from dual
    union all select 2, 10 from dual
    --union all select 3, 10 from dual
    --union all select 4, 30 from dual
)
/
这个:
with tmp_tab as (
    select project_id, trim(t) as keyword, i
        from projects
        model
        return updated rows
        partition by (project_id)
        dimension by (0 i)
        measures (project_title t)
        rules (t[for i from 1 to
                (length(regexp_replace(\':\' || t[0],\'[^:]\')) - 1) increment 1]
            = regexp_substr(t[0],\'[^:]+\',1,cv(i)))
    order by project_id, i
)
select tt.keyword,
    count(distinct tt.project_id) as total_projects,
    sum(h.hours) as total_hours
from tmp_tab tt
left join project_hours h on h.project_id = tt.project_id
group by tt.keyword
/
给出以下内容:
KEYWORD                          TOTAL_PROJECTS     TOTAL_HOURS        
-------------------------------- ------------------ ------------------ 
Bridge                           1                  10                 
ETL                              2                  30                 
Client                           2                  30                 
ASCX                             1                  20                 
编辑或者,如果包括第二组示例,则给出:
KEYWORD                          TOTAL_PROJECTS     TOTAL_HOURS        
-------------------------------- ------------------ ------------------ 
ETL                              4                  70                 
Bridge                           1                  10                 
Interface                        1                  10                 
Client                           2                  30                 
ASCX                             1                  20                 
改编自这里的答案-因此,任何荣誉都应该归功于Rob van Wijk。 我已经假定关键字总是后面跟一个冒号,而最后一个冒号之后的任何内容都不应被视为关键字,只需要在
length()
处加上-1。     
        
select count(*) as projectcount, sum(hours) as totalhours from projects WHERE title like \'%mykeyword:%\';
    

要回复问题请先登录注册