繁体   English   中英

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

[英]Finding string within a string in a SQL statement

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

项目标题包含关键字,关键字由格式“关键字:”即“ 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 (最初发布为“答案”):

进一步的例子:

假设我有两个记录,其中包含以下项目标题:

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子句进行拆分(只是一种方式)。 假设您有一个单独的projectproject_hours表,这些表通过一个ID字段建立关系:

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:%';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM