2011-06-16 143 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