句子中的最后一个单词:在SQL中(可以使用正则表达式吗?)

4

我需要在Oracle SQL (10gR2)中完成此任务,但我想,更好、更高效的算法也可以。

给定一行(或句子,包含一个或多个单词,英文),如何找到该句子的最后一个单词?

以下是我在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

好的,一个相关的问题:https://dev59.com/UHA65IYBdhLWcg3wxBir - Guru
6个回答

9

我认为使用INSTR/SUBSTR更简单:

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

我遇到了错误:Msg 195,Level 15,State 10,Line 2 “INSTR”不是一个被识别的内置函数名称。 - Anjan Kant
@AnjanKant,这个错误表明您没有使用Oracle。 - Jeffrey Kemp

2

不确定性能如何,但这应该可以解决:

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

如果句子末尾有句号或其他字符,这将无法正常工作,编译器也是如此。 - Jesse
@Jesse:是的,也许每个非空白字符会是更好的解决方案。 - Wolph
1
从双重选择中,select regexp_substr(&p_word_in, '[^\s]+$') 或 select regexp_substr(&p_word_in, '(\w+)[^\w]*$'),两者都可以工作。第一个将获取句点,第二个则不会(我不确定 Oracle 如何处理括号)。 - Jesse
@Jesse:就记录而言,[^\s]\S是相同的,[^\w]\W也是相同的 :) - Wolph

1

我不确定你是否能在oracle中使用正则表达式,但是

(\w+)\W*$

不会有用吗?


0

这也适用于非英语单词:

SELECT REGEXP_SUBSTR ('San maria Calle Cáceres Numéro 25 principal izquierda, España', '[^ .]+$') FROM DUAL;

0

这个正则表达式匹配一行中的最后一个单词:

\w+$

而RegexBuddy为在Oracle中使用提供了以下代码:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接