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

时间:2011-06-16 14:29:28

标签: sql oracle nested-loops

我有一个列显示了我们公司所经历的项目的标题,另一列显示了每个项目的工作时间。

项目标题包含关键字,关键字由“关键字:”格式定义,即“ETL:”

有些项目有多个关键字,即'Client: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中完成吗?

任何参赛者?

更新(最初发布为“答案”):

进一步的例子:

假设我有以下项目标题的两条记录:

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中?

2 个答案:

答案 0 :(得分:1)

不是很漂亮,但您可以使用MODEL子句进行拆分(只有一种方式)。假设您通过ID字段分别拥有projectproject_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                 

根据答案here改编 - 所以任何赠送都应该真正转到Rob van Wijk

我假设关键字后面总是跟冒号,最后一个冒号之后的任何内容都不应该被视为关键字,只需要在length()中添加-1。

答案 1 :(得分:0)

select count(*) as projectcount, sum(hours) as totalhours from projects WHERE title like '%mykeyword:%';