Последнее слово в предложении: в SQL (возможны ли регулярные выражения?) - PullRequest
4 голосов
/ 11 октября 2010

Мне нужно, чтобы это было сделано в Oracle SQL (10gR2).Но я полагаю, я бы лучше выразился, любой хороший, эффективный алгоритм в порядке.

Учитывая строку (или предложение, содержащее одно или несколько слов на английском языке), как вы найдете последнее слово в предложении?

Вот что я пробовал в SQL.Но я хотел бы увидеть эффективный способ сделать это.

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

Идея состояла в том, чтобы перевернуть строку, найти первый встречающийся пробел, извлечь подстроку и перевернуть строку.Это довольно эффективно?Доступно ли регулярное выражение?Я на Oracle 10g R2.Но я не возражаю видеть какие-либо попытки на другом языке программирования, я не против написать функцию PL / SQL в случае необходимости.

Обновление:

Джеффри Кемп дал замечательный ответ.Это прекрасно работает.

Ответ

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

Ответы [ 5 ]

7 голосов
/ 12 октября 2010

Я считаю, что проще с INSTR / SUBSTR:

WITH q AS (SELECT 'abc def ghi' AS sentence FROM DUAL)
SELECT SUBSTR(sentence, INSTR(sentence,' ',-1) + 1)
FROM q;
2 голосов
/ 11 октября 2010

Не уверен, как это с точки зрения производительности, но это должно сделать это:

select regexp_substr(&p_word_in, '\S+$') from dual;
1 голос
/ 11 октября 2010

Я не уверен, что вы можете использовать регулярные выражения в Oracle, но не будет

(\ w +) \ W * $

работать?

0 голосов
/ 11 октября 2010

оставляет пунктуацию, но получает последнее слово

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
0 голосов
/ 11 октября 2010

Это регулярное выражение соответствует последнему слову в строке:

\w+$

И RegexBuddy дает этот код для использования в Oracle:

DECLARE
        match VARCHAR2(255);
BEGIN
        match := REGEXP_SUBSTR(subject, '[[:alnum:]]_+$', 1, 1, 'c');
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...