2011-06-16 94 views
1

我有一列显示了我们公司已经经历的项目的标题,另一列有几个小时为每个项目工作。在SQL语句中查找字符串中的字符串

标题中包含关键字的项目中,关键字由格式定义的“关键词:”即“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 

那么肯定,我可以用一个喜欢找ETL,或接口的所有实例,但我需要打破在选择每个关键字。在上面的例子中,如果我使用了类似的'%ETL:%',我会得到两个记录,但我希望看到所有关键字的全部小时数,按关键字细分。

也许一个更好的问题是:

我怎样才能得到看起来像这样的记载:

Interface: ETL: 

到输出看起来像这样:

Interface: 
ETL: 

SQL内?

+0

我想了解问题。您正试图搜索项目列中是否出现特定子字符串的记录?如果是这样就像使用'LIKE'关键字一样简单,'WHERE Project LIKE'%ETL%'' – 2011-06-16 14:34:41

+1

“获取关键字的第一个实例很容易”,您可能希望包含这个简化/匿名版本以帮助展示你想要完成的事情。向我们提供样本数据清单以及您想要实现的内容也有所帮助。 – 2011-06-16 14:39:43

+0

看到我的OP,我给出了例子和预期的输出。在我的例子中,我有两个项目记录,我期望在预期输出中有4个记录,因为项目记录中有4个不同的关键字。我正在使用SUBSTR(project_title,1,INSTR(SUBSTR(porject_title,1(instr(project_title,'')),':')),但只发现关键字的第一个实例,而不是嵌套的 – 2011-06-16 14:51:06

回答

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

而像%mykeyword:%将在搜索特定关键字时起作用,但当我想要搜索所有关键字时效果不佳。同样,如果单个记录具有三个关键字,我想要的输出是三个记录,每个关键字一个。看到上面的预期输出应该是我提供的例子。 – 2011-06-16 14:46:52

+0

我不认为这是可能的与一个“简单”sql语句与这样的数据库设计如果关键字在不同的表中可以加入/ group by,这很容易,你的设计我猜你必须首先以编程方式提取所有关键字,然后逐个循环。 – Gryphius 2011-06-16 14:54:44

1

不是很漂亮,但你可以使用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     

改编自答案here - 所以任何功劳应该去Rob van Wijk真的。

我假定关键字后面总是冒号,最后一个冒号后面的任何内容都不应当作为关键字来处理,它只需要在length()之后加上-1即可。

+0

+1提醒你有些模糊的MODEL子句。源对m没有结果即 – DCookie 2011-06-16 16:49:36

+0

@DCookie - '有点模糊'有点轻描淡写,我甚至找不到任何有用的链接到文档。我发布这篇文章的原因部分是因为我对'MODEL'很感兴趣,尽管我还没有找到它的用处,说实话还没有完全理解它。该链接有一个额外的'&',它是在一些浏览器中修复它 - 修复,谢谢。 – 2011-06-16 17:04:18