Как выбрать последнее предложение из столбца, который начинается с числа - PullRequest
1 голос
/ 19 сентября 2019

Я хочу получить последнее предложение, начинающееся с числа в столбце.

Пример кода:

WITH q AS (SELECT '1.abc def ghi 2.sdadasd. rewtretrtr1 3. hjgjhjhgj, yo whats. 4. gog mi man. Its been' AS sentence FROM DUAL)
SELECT SUBSTR(sentence, INSTR(sentence,'.',-1) + 1)
FROM q;

Мой вывод

Its been

Ожидаемый результат

4. gog mi man. Its been

Возможно ли это в Oracle?

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Это хороший вариант использования для удобной функции регулярного выражения Oracle REGEXP_SUBSTR():

SELECT REGEXP_SUBSTR(sentence, '\d\.\D+$') FROM q;

Разбиение регулярного выражения:

\d   -- a digit
\.   -- a dot
\D+  -- as many non-digit characters as possible (at least one)
$    -- end of string

REGEXP_SUBSTR() ищетстрока для a для заданного регулярного выражения и возвращает данный случай (первый случай по умолчанию).

Демонстрация на DB Fiddle :

WITH q AS (SELECT '1.abc def ghi 2.sdadasd. rewtretrtr1 3. hjgjhjhgj, yo whats. 4. gog mi man. Its been' AS sentence FROM DUAL)
SELECT REGEXP_SUBSTR(sentence, '\d\.\D+$') FROM q;
| REGEXP_SUBSTR(SENTENCE,'\D\.\D+$') |
| :--------------------------------- |
| 4. gog mi man. Its been            |

РЕДАКТИРОВАТЬ

Оказывается, вы имеете дело с гораздо более сложными строками:

  • часть для захвата может содержать числа
  • строка может содержать новую строку

Поэтому я бы предложил новый подход, основанный на REGEXP_REPLACE() для удаления нежелательной части строки.

Обратите внимание:

SELECT REGEXP_REPLACE(sentence, '.*\d+\.', '', 1, 0, 'n') FROM q;

Regexp .*\d+\. будет ужасно соответствовать всему от начала строки до последнего вхождения цифры, за которой следуют точка и пробел.REGEXP_REPLACE подавит эту часть строки.Модификатор 'n' позволяет символу . совпадать с символом новой строки.

С этим выражением вы получаете ожидаемую часть строки, только минус цифра (ы) и точка в начале(это так же хорошо, как это получается, поскольку Oracle не поддерживает просмотр в регулярном выражении ... вздох).

Демонстрация по БД Fiddle :

Учитывая эту входную строку:

We have received customer approval on the 
warranty nozzle including revised ERO repairs. Please proceed with the repairs. 
Please provide photos and damage mapping when complete per customer requests." 9/12/19 MH
10. CHECKING WITH VENDOR ABOUT ECD. 9/13/19 
MH11. Per Vendor,
"Originally I quoted a 3-4 week delivery once approved. This month is shot. W
e are booked solid. We estimate a delivery date of 10/11" 9/13/19 MH

Запрос возвращает:

 Per Vendor,
"Originally I quoted a 3-4 week delivery once approved. This month is shot. W
e are booked solid. We estimate a delivery date of 10/11" 9/13/19 MH
0 голосов
/ 19 сентября 2019

Это довольно сложно, если ваши предложения могут содержать цифры.Но это можно сделать в Oracle:

WITH q AS (
      SELECT '1.abc def ghi 2.sdadasd. rewtretrtr1 3. hjgjhjhgj, yo whats. 4. gog mi man. Its been' AS sentence FROM DUAL union all
      SELECT '1.abc def ghi 2.sdadasd. rewtretrtr1 3. hjgjhjhgj, yo whats. 4. gog mi 3 men. Its been' AS sentence FROM DUAL 
     )
SELECT regexp_substr(sentence, '\d[.](\D|\d+[^.])*$')
FROM q;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...