2010-10-11 13 views
3

我需要在Oracle SQL(10gR2)中完成此操作。但我想,我寧願說清楚,任何好的,有效的算法都可以。句中的最後單詞:在SQL中(正則表達式可能?)

給出一行(或句子,包含一個或多個單詞,英語),你將如何找到句子的最後一個單詞?

這是我在SQL中試過的。但是,我希望看到這樣做的有效方法。

select reverse(substr(reverse(&p_word_in) 
         , 0 
         , instr(reverse(&p_word_in), ' ') 
         ) 
       ) 
     from dual; 

當時的想法是扭轉字符串,找到第一個出現的空間,檢索子和反向的字符串。它效率很高嗎?是否有正則表達式?我在Oracle 10g R2上。但我不介意看到其他編程語言的任何嘗試,我不介意編寫一個PL/SQL函數,如果需要的話。

更新:

Jeffery Kemp給出了一個很好的答案。這工作完美。

回答

SELECT SUBSTR(&sentence, INSTR(&sentence,' ',-1) + 1) 
FROM dual 
+0

好,很好。一個相關的問題:http://stackoverflow.com/questions/3648133/regular-expression-to-find-last-word-in-sentence – Guru 2010-10-11 18:35:43

回答

5

我認爲它與INSTR/SUBSTR簡單:

WITH q AS (SELECT 'abc def ghi' AS sentence FROM DUAL) 
SELECT SUBSTR(sentence, INSTR(sentence,' ',-1) + 1) 
FROM q; 
+0

+1啊!我怎麼錯過「-1」選項。涼。 – Guru 2010-10-12 04:14:29

+0

謝謝傑夫,給出了精彩的答案。 – Guru 2010-10-19 03:47:50

+0

我收到錯誤:消息195,級別15,狀態10,行2 'INSTR'不是公認的內置函數名稱。 – 2016-04-27 05:03:52

0

此正則表達式的最後一個字相匹配一行:

\w+$ 

而且使用RegexBuddy給出了甲骨文這個代碼的使用:

DECLARE 
     match VARCHAR2(255); 
BEGIN 
     match := REGEXP_SUBSTR(subject, '[[:alnum:]]_+$', 1, 1, 'c'); 
END; 
2

不知道怎麼了性能明智,但這應該做到這一點:

select regexp_substr(&p_word_in, '\S+$') from dual; 
+0

這將不會工作,如果有一段時間或其他字符在感謝,compie也一樣。 – Jesse 2010-10-11 18:41:07

+0

@Jesse:true,也許每個非空白字符都是更好的解決方案 – Wolph 2010-10-11 18:42:19

+1

select dual;或從雙重選擇regexp_substr(&p_word_in,'(\ w +)[^ \ w] * $');應該都可以工作。第一個將抓住這個時期,第二個不應該(我不確定在oracle中如何處理圓括號) – Jesse 2010-10-11 18:44:01

1

我不知道你是否能在Oracle使用正則表達式,但不會

(\ w +)\ W * $

工作?

+0

+1謝謝Jesse。讓我們看看其他選項。 – Guru 2010-10-11 18:54:14

0

這留下的標點符號,但得到的最後一句話

with datam as (
SELECT 'abc asdb.' A FROM DUAL UNION 
select 'ipso factum' a from dual union 
select 'ipso factum' a from dual union 
SELECT 'ipso factum2' A FROM DUAL UNION 
SELECT 'ipso factum!' A FROM DUAL UNION 
SELECT 'ipso factum !' A FROM DUAL UNION 
SELECT 'ipso factum/**//*/?.?' A FROM DUAL UNION 
SELECT 'ipso factum ...??!?!**' A FROM DUAL UNION 
select 'ipso factum ..d.../.>' a from dual 

) 
SELECT a, 
--REGEXP_SUBSTR(A, '[[:alnum:]]_+$', 1, 1, 'c') , /** these are the other examples*/ 
--REGEXP_SUBSTR(A, '\S+$') , /** these are the other examples*/ 
regexp_substr(a, '[a-zA-Z]+[^a-zA-Z]*$') 

from datam 
相關問題