Как использовать regexp_substr

У меня есть номер звонка:

TX353 G35 1992
Ref QP141 B151 R4 1956
RM216 M285 K5 1996
T385 C22 1960
Ths LB500 M200 A5 1998

я хочу привести:

TX353 G35 1992          =>TX
Ref QP141 B151 R4 1956  =>QP
RM216 M285 K5 1996      =>RM
T385 C22 1960           =>T
Ths LB500 M200 A5 1998  =>LB

я использую:

SELECT REGEXP_SUBSTR(callnumber,'[A-Z]+')

результат не верен TX R RM T T

4 ответа

Решение

Попробуй это. Чтобы искать две последовательные заглавные буквы. я использовал NVL() попытаться принять единственное вхождение заглавной буквы.

Кредиты для MT0 для этого

[A-Z]{2}

Пример:

with my_data(str) as
(
  select 'TX353 G35 1992' from dual
  union all
  select 'Ref QP141 B151 R4 1956' from dual
  union all
  select 'RM216 M285 K5 1996' from dual
  union all
  select 'T385 C22 1960' from dual
  union all
  select 'Ths LB500 M200 A5 1998' from dual

)
  select str,NVL(regexp_substr(str,'[A-Z]{2,}'),regexp_substr(str,'([A-Z]+)\d',1,1,NULL,1)) from my_data;

Выход:

TX353 G35 1992          TX
Ref QP141 B151 R4 1956  QP
RM216 M285 K5 1996      RM
T385 C22 1960           T
Ths LB500 M200 A5 1998  LB

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

Если вам нужно извлечь полную последовательность CAPS.

Ты нуждаешься в этом, [A-Z]{2,}

Похоже, вам нужны первые заглавные буквы, за которыми следуют несколько цифр:

Установка Oracle:

CREATE TABLE your_table ( your_column ) AS
  SELECT 'TX353 G35 1992'         FROM DUAL UNION ALL
  SELECT 'Ref QP141 B151 R4 1956' FROM DUAL UNION ALL
  SELECT 'RM216 M285 K5 1996'     FROM DUAL UNION ALL
  SELECT 'T385 C22 1960'          FROM DUAL UNION ALL
  SELECT 'Ths LB500 M200 A5 1998' FROM DUAL UNION ALL
  SELECT 'Ref A123 B456 C7 2000'  FROM DUAL;

Запрос:

SELECT REGEXP_SUBSTR(
         your_column,
         '([A-Z]+)\d',
         1,     -- Start at the first character
         1,     -- Get the first match
         NULL,  -- Case sensitive
         1      -- Return the first capture group
       ) As match
FROM   your_table

Выход:

MATCH
-----
TX
QP
RM
T
LB
A

Удалите "Ref" и "Ths" из номера вызова, и ваш код работает

Вот один из способов сделать это:

WITH sample_data AS (select 'TX353 G35 1992' str from dual union all
                     select 'Ref QP141 B151 R4 1956' str from dual union all
                     select 'RM216 M285 K5 1996' str from dual union all
                     select 'T385 C22 1960' str from dual union all
                     select 'Ths LB500 M200 A5 1998' str from dual union all
                     select 'X12345' str from dual union all
                     select 'Y F123' str from dual)
SELECT str,
       regexp_substr(str, '([A-Z]{1,2})[[:digit:]]*( |$)', 1, 1, NULL, 1) sub_str
FROM   sample_data;

STR                    SUB_STR
---------------------- ----------------------
TX353 G35 1992         TX
Ref QP141 B151 R4 1956 QP
RM216 M285 K5 1996     RM
T385 C22 1960          T
Ths LB500 M200 A5 1998 LB
X12345                 X
Y F123                 Y

Это ищет образец одной или двух заглавных букв, сопровождаемых 0 или больше цифр, сопровождаемых пробелом или концом строки. (Если вы хотите ограничить количество цифр до 1 или более, измените * к +.)

Мы ставим скобки вокруг "одной или двух заглавных букв", чтобы пометить его как подвыражение, которое мы затем можем запросить для вывода в regexp_substr (это последний параметр, который в нашем случае равен 1, потому что наше желаемое подвыражение является первым один встречал).

Если у вас есть другие специальные символы, которые могут следовать вашему желаемому шаблону, то вы можете просто развернуть раздел ИЛИ (в настоящее время ( |$)), например, если вы хотите включить знак вопроса, раздел ИЛИ станет ( |?|$)

Другие вопросы по тегам