[英]Finding string within a string in a SQL statement
我有一列显示了我们公司经历的项目的标题,另一列显示了每个项目的工作时间。
项目标题包含关键字,关键字由格式“关键字:”即“ ETL:”定义
一些项目具有多个关键字,即“客户:ETL:ASCX:”
因此,例如,项目标题可以是“客户:ETL:ASCX:更新导入过程”
我不提前知道这些关键字。
我想要给定关键字的总小时数和项目数,因此让我们使用以下两个项目标题作为示例:
该报告应给出:
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
子句进行拆分(只是一种方式)。 假设您有一个单独的project
和project_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.