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

在SQL语句中的字符串中查找字符串,sql,oracle,nested-loops,Sql,Oracle,Nested Loops,我有一个专栏,显示了我们公司经历的项目的标题,另一个专栏为每个项目列出了工作时间 项目标题包含关键字,关键字由格式“关键字:”定义,即“ETL:” 有些项目有多个关键字,即“Client:ETL:ASCX:” 例如,项目标题可以是“Client:ETL:ASCX:updatetheimportprocess” 我不知道提前的关键字 我想要给定关键字的总小时数和项目数 因此,让我们以以下两个项目名称为例: 客户:ETL:ASCX:有20个小时的 投入的工作 客户机:ETL: 布里奇:投入了10个

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

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

有些项目有多个关键字,即“Client:ETL:ASCX:”

例如,项目标题可以是“Client:ETL:ASCX:updatetheimportprocess”

我不知道提前的关键字

我想要给定关键字的总小时数和项目数 因此,让我们以以下两个项目名称为例:

  • 客户: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分配了40个小时,因为有两个项目将ETL作为关键字:

ETL: 40
Interface: 10
当然,我可以使用LIKE来查找ETL或Interface的所有实例,但我需要在selecteach关键字中进行分解。例如,在上面的示例中,如果我使用类似“%ETL:%”的值,我将获得两条记录,但我希望看到所有关键字的所有小时数,按关键字细分

也许更好的问题是:

我如何获得如下所示的记录:

Interface: ETL:
Interface:
ETL:
输入一个如下所示的输出:

Interface: ETL:
Interface:
ETL:

在sql中?

不是很漂亮,但是您可以使用
MODEL
子句进行拆分(只有一种方式)。假设您有单独的
project
project\u hours
表,它们通过一个ID字段建立了关系:

select count(*) as projectcount, sum(hours) as totalhours from projects WHERE title like '%mykeyword:%';
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
)
/
这:

给出了:

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                 
改编自一个答案-所以任何信用都应该是真的


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

中添加一个-1就可以了,这不是很漂亮,但是您可以使用
MODEL
子句进行拆分(只有一种方式)。假设您有单独的
project
project\u 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
)
/
这:

给出了:

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                 
改编自一个答案-所以任何信用都应该是真的


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

中添加一个-1,我正在试图理解这个问题。您正在尝试搜索有关项目列中是否出现特定子字符串的记录?如果是这样的话,这就像使用
LIKE
关键字一样简单,
WHERE Project LIKE“%ETL%”
“获取关键字的第一个实例很容易”您可能希望包含此关键字的简化/匿名版本,以帮助演示您试图完成的任务。给我们一个示例数据列表以及您试图实现的目标也会有所帮助。请参阅我的OP,我给出了示例和预期输出。在我的示例中,我有两个项目记录,预期输出中有4个记录,因为项目记录中有4个不同的关键字。我目前正在使用SUBSTR(project_title,1,INSTR)(SUBSTR(project_title,1)(INSTR(project_title,,,,,,:))但这只会找到关键字的第一个实例,而不是嵌套的关键字。我正在试图理解这个问题。您正在尝试搜索关于某个特定子字符串是否出现在项目列中的记录?如果是这样,这就像使用
LIKE
关键字,
WHERE Project LIKE“%ETL%”
“获取关键字的第一个实例很容易"您可能希望包含此文件的简化/匿名版本,以帮助演示您试图完成的任务。给我们一个示例数据列表以及您试图实现的目标也会有所帮助。请参阅我的OP,我给出了示例和预期输出。在我的示例中,我有两个项目记录,预期输出中有4个记录,因为在项目记录中有4个不同的关键字。我目前正在使用SUBSTR(项目标题,1,INSTR)(SUBSTR(项目标题,1,INSTR(项目标题,),:))但这只会找到关键字的第一个实例,而不是嵌套的关键字。虽然像%mykeyword%这样的关键字在搜索特定关键字时会起作用,但当我要搜索所有关键字时,它不会起作用。同样,如果一条记录有三个关键字,我想要的输出是三条记录,每个关键字对应一条记录。有关我预期的输出,请参见上文t应该是我提供的例子。我认为“简单”是不可能的sql语句,数据库设计如下。如果关键字位于不同的表中,则可以很容易地进行连接/分组。使用您的设计,我想您必须首先以编程方式提取所有关键字,然后逐个循环。虽然像%mykeyword:%这样的关键字在搜索特定关键字时会起作用,但它不起作用当我想搜索所有的关键字时。同样,如果一条记录有三个关键字,我想要的输出是三条记录,每个关键字对应一条记录。关于我提供的示例,我的预期输出应该是什么,请参见上文。我不认为用“简单”就可以做到这一点sql语句,数据库设计如下。如果关键字位于不同表中的何处,则可以很容易地将其加入/分组。使用您的设计