2015-02-17 24 views
0

我正在尋找最好的方式來排除以下查詢的結果不需要的文本:如何裁減不必要的文/從查詢字符導致

QUERY:

select message_ 
from jbpm_comment 
order by time_ desc 

結果:

enter image description here 出於安全考慮,我已將網址變黑。突出顯示的文字「這是另一項測試,我會接受!」是我想要返回的。我需要找出一種方法來降從外地一切:

需要刪除:

  • 我需要保持文本之前: 2015年測試計劃^ |^^ |^g9xg3^|^^閱讀| ^^ |^2015年測試計劃 - 人力資源已批准接受^ |^
  • 繼我需要保持文本: HTML A HREF =「https://開頭URL_REMOVED_>點擊這裏查看詳情

我還沒有能夠根據需要合併TRIM,但我可能會缺少一些功能步驟。任何建議表示讚賞。謝謝!

+1

您只顯示要刪除的固定字符串。您是否有某種模式/規則來識別要保留的部件以及要移除的部件? – 2015-02-17 23:20:12

+0

對不起,延遲的答覆,並感謝您的答覆。不幸的是,字符串會有所不同。他們將遵循「TEMPLATENAME^| ^^ |^USERID^|^READ/UNREAD^|^^ | ^接受/查詢^ | ^」我想要保留 web url「的文本的一般模式 - 換句話說,TEMPLATENAME將改變,USERID將改變,READ/UNREAD將波動,ACCEPTED/INQUIRED將隨着其他狀態的變化而波動。唯一的靜態結果看起來是url鏈接,從標籤開始並以「點擊這裏查看細節」。 – jdgaub 2015-02-18 15:03:54

回答

1

鑑於模式你介紹一下,你可以使用正則表達式去除你不想要的部分。您似乎有由^|^分隔的元素,因此您可以刪除由the regexp_replace() function(\^\|\^.*\^\|\^)(轉義特殊字符)組成的模式所包含的任何內容,但您也希望在第一個分隔符之前刪除文本;你也許可以簡化此一點,但作爲一個起點和一個CTE來提供你的兩個樣本值:

with t as (
    select '2015 Test Plan^|^^|^g9xg3^|^read^|^^|^2015 Test Plan - HR Approval has been accepted^|^This is another test. I will accept!<html><a href="https://URL_REMOVED_> Click here to view the details' as text from dual 
    union all select 'TemplateName^|^^|^USERID^|^read/unread^|^^|^Accepted or Inquired^|^THE TEXT I WANT TO KEEP <html>web url' as text from dual 
) 
select regexp_replace(text, '^.*(\^\|\^.*\^\|\^)') 
from t; 

KEEP                          
-------------------------------------------------------------------------------------------------------- 
This is another test. I will accept!<html><a href="https://URL_REMOVED_> Click here to view the details 
THE TEXT I WANT TO KEEP <html>web url                  

然後,它的結果可以被送入第二regexp_replace,消除任何開始<html>

with t as (
    select '2015 Test Plan^|^^|^g9xg3^|^read^|^^|^2015 Test Plan - HR Approval has been accepted^|^This is another test. I will accept!<html><a href="https://URL_REMOVED_> Click here to view the details' as text from dual 
    union all select 'TemplateName^|^^|^USERID^|^read/unread^|^^|^Accepted or Inquired^|^THE TEXT I WANT TO KEEP <html>web url' as text from dual 
) 
select regexp_replace(regexp_replace(text, '^.*(\^\|\^.*\^\|\^)'), '<html.*') as keep 
from t; 

KEEP          
---------------------------------------- 
This is another test. I will accept!  
THE TEXT I WANT TO KEEP     

Read more about Oracle's regular expression support

+0

謝謝!這正是我需要的。還有一個問題,我不敢相信在你把它放在上面之後,我正在努力解決這個問題,但是我怎樣才能在「2015測試計劃」之後刪除字符串中的所有內容。我需要在字符串中的第一個^ | ^之前保留任何文本。在上面的例子中,我需要保留2015年測試計劃,同時放棄^^^^^之後的所有內容。我試着修改上面的代碼,如下所示:'從jbpm_comment'選擇regexp_replace(message_,'^ | ^^} ^。*'),但是這會返回整個字段值,包括不需要的字符。 – jdgaub 2015-02-18 16:55:48

+1

@jdgaub - 用'regexp_replace(text,'\^\ | \ ^。*')'。模式匹配默認爲'貪婪',因此它將刪除最長的匹配字符串,這是(包括)第一個分隔符的所有內容。 (在你的版本中,你並不是逃避特殊符號'^'和'|';並且不確定在那裏做什麼}} 8) – 2015-02-18 16:59:41

+0

是的,就是這樣。所以,\有助於分解模式字符串,迫使它把任何東西看作獨特的模式。我的理解是否正確?再次感謝你的幫助。我總是喜歡從這個網站收集新的東西。巨大的資源。 – jdgaub 2015-02-18 17:13:10

0

試試這個。 (我不知道這是否是要排除靜態文本,但即便如此,這可能會爲你工作)

select replace('blabla I will accept blabla','I will accept','') from dual;

現在只有「布拉布拉布拉布拉」左

+0

我認爲你放棄了錯誤的部分,但很難從問題中得知。儘管嵌套替換調用會放棄兩個(不同的)'blabla'位,如果它們確實是固定字符串的話。 – 2015-02-17 23:48:14