Oracle SQL REGEX извлекает текст из середины varchar2 - PullRequest
0 голосов
/ 08 марта 2019

Я хочу извлечь немного текста из середины столбца varchar2.

Вот несколько примеров:

 TEST DATA - SCOTLAND 1A
 TEST DATA - ENGLAND 6A
 TEST DATA - WALES 3A
 TEST DATA - IRELAND 2A

Данные, которые я хочу вернуть, будут: -

 SCOTLAND
 ENGLAND
 WALES
 IRELAND

Большое спасибо

Lee

Ответы [ 4 ]

0 голосов
/ 08 марта 2019

Одним из вариантов будет применение сначала regexp_replace() в качестве шаблона, который ищет цифры, чтобы видеть названия стран в качестве третьих слов, и regexp_substr() для извлечения только этих.

with cte as
(
 select 'TEST DATA - SCOTLAND 1A' as str from dual union all 
 select 'TEST DATA - ENGLAND 6A'         from dual union all 
 select 'TEST DATA - WALES 3A'           from dual union all 
 select 'TEST DATA - IRELAND 2A'         from dual
)    
select regexp_substr(  
                     regexp_replace(str, '-(.*)\d.*', '\1' ) 
                     , '[^ ]+', 1 , 3 )
       as "Country",
       trim(regexp_substr( str, '[^-]+(\s)', 1 , 2 ))
       as "Country2"
  from cte;

Country    Country2
--------   --------
SCOTLAND   SCOTLAND
ENGLAND    ENGLAND
WALES      WALES
IRELAND    IRELAND

Демо

P.S. «column2» может быть более разумной альтернативой без необходимости использования функции regexp_replace().

0 голосов
/ 08 марта 2019

Это может быть способ, предполагая, что вам нужно получить часть строки между (уникальным) '-' и первой цифрой.

with testTable(string) as (
    select 'TEST DATA - SCOTLAND 1A' from dual union all
    select 'TEST DATA - ENGLAND 6A' from dual union all
    select 'TEST DATA - WALES 3A' from dual union all
    select 'TEST DATA - IRELAND 2A' from dual union all
    select 'TEST DATA - NORTHERN IRELAND 2A' from dual
)
select string,
       regexp_substr(string, '\- ([^0-9]*)[0-9]', 1, 1, 'i', 1) result
from testTable



STRING                          RESULT                         
------------------------------- -------------------------------
TEST DATA - SCOTLAND 1A         SCOTLAND                       
TEST DATA - ENGLAND 6A          ENGLAND                        
TEST DATA - WALES 3A            WALES                          
TEST DATA - IRELAND 2A          IRELAND                        
TEST DATA - NORTHERN IRELAND 2A NORTHERN IRELAND               

5 rows selected.
0 голосов
/ 08 марта 2019

Спасибо Алексею за CTE.

Как насчет хорошего, старого SUBSTR + INSTR?

SQL> with testTable(string) as (
  2      select 'TEST DATA - SCOTLAND 1A' from dual union all
  3      select 'TEST DATA - ENGLAND 6A' from dual union all
  4      select 'TEST DATA - WALES 3A' from dual union all
  5      select 'TEST DATA - IRELAND 2A' from dual union all
  6      select 'TEST DATA - NORTHERN IRELAND 2A' from dual
  7  )
  8  select
  9    string,
 10    trim(substr(string,
 11                instr(string, '-') + 1,
 12                instr(string, ' ', -1) - instr(string, '-')
 13         )) result
 14  from testtable;

STRING                          RESULT
------------------------------- -------------------------------
TEST DATA - SCOTLAND 1A         SCOTLAND
TEST DATA - ENGLAND 6A          ENGLAND
TEST DATA - WALES 3A            WALES
TEST DATA - IRELAND 2A          IRELAND
TEST DATA - NORTHERN IRELAND 2A NORTHERN IRELAND

SQL>
0 голосов
/ 08 марта 2019

Этот запрос работает:

SELECT
    input,
    REGEXP_REPLACE(input, '.*- (\D+).*', '\1') AS country
FROM yourTable;

enter image description here

Демо

Здесь мы используем REGEXP_REPLACE с шаблоном:

.*- (\D+).*

Здесь фиксируются любые нецифровые символы, встречающиеся между тире и пробелом, следующим за названием страны. Затем мы просто заменим этим захваченным названием страны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...