Oracle regexp_substr для извлечения данных - PullRequest
2 голосов
/ 20 июня 2020

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

Строка ввода: My ADSL 14Mbps/2M speed

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

Download_speed = 14
Upload_speed = 2

My SQL

SELECT regexp_substr('My ADSL 14Mbps/2M speed','[^\/]+') donwload_speed
      ,regexp_substr('My ADSL 14Mbps/2M speed','[^\/]+$') upload_speed
  FROM dual 

вывод идет, как указано выше SQL

download_speed = My Fiber 14Mbps
upload_speed = 2M speed

Ответы [ 4 ]

2 голосов
/ 20 июня 2020

Вы можете использовать

SELECT regexp_substr('My ADSL 14Mbps/2M speed','(\d+)Mbps/\d+M', 1, 1, NULL, 1) donwload_speed
      ,regexp_substr('My ADSL 14Mbps/2M speed','\d+Mbps/(\d+)M', 1, 1, NULL, 1) upload_speed
  FROM dual 

См. SQLFiddle

Шаблон (\d+)Mbps/\d+M соответствует и захватывает в Группу 1 любую одну или несколько цифр, затем Mbps/, затем 1+ цифр и затем M (значение группы извлекается с помощью последнего аргумента 1).

Шаблон \d+Mbps/(\d+)M соответствует любой одной или нескольким цифрам, затем Mbps/, затем 1+ цифр, захваченных в Группу 1, а затем M.

См. демонстрация регулярного выражения # 1 и демонстрация регулярного выражения # 2 .

1 голос
/ 20 июня 2020

Вам нужно только извлечь последовательности цифр (\d+), начиная с позиции 1:

  • для загрузки 1 последовательности di git
  • для частота загрузки 2 последовательности di git.

Вот код SQL:

SQL> SELECT
  2  'download_speed = ' || regexp_substr('My ADSL 14Mbps/2M speed','(\d+)', 1, 1)
  3  ||
  4  ' upload_speed = ' || regexp_substr('My ADSL 14Mbps/2M speed','(\d+)', 1 ,2)
  5  as output
  6  from dual;

OUTPUT
----------------------------------------
download_speed = 14 upload_speed = 2

SQL> 
1 голос
/ 20 июня 2020

Я думаю, что если вы хотите получить только числа, я бы сделал это:

SQL> col download_speed for 999999 heading "download_speed"
SQL> col upload_speed for 999999 heading "upload_speed"
SQL> SELECT regexp_replace(regexp_substr('My ADSL 14Mbps/2M speed','[^\/]+'),'[^0-9]', '') download_speed
  ,regexp_replace(regexp_substr('My ADSL 14Mbps/2M speed','[^\/]+$'), '[^0-9]', '') upload_speed FROM dual;

do u
-- -
14 2

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

    select *
from (
SELECT regexp_replace(regexp_substr('My ADSL 14Mbps/2M speed','[^\/]+'),'[^0-9]', '') download_speed
      ,regexp_replace(regexp_substr('My ADSL 14Mbps/2M speed','[^\/]+$'), '[^0-9]', '') upload_speed
  FROM dual
) unpivot include nulls ( val for col in (download_speed,upload_speed) );

COL            VA
-------------- --
DOWNLOAD_SPEED 14
UPLOAD_SPEED   2

Вы можете изменить значения COL и VA для нужных вам ярлыков

0 голосов
/ 21 июня 2020

Один из вариантов - использовать REGEXP_REPLACE(), который ищет символы di git с replace_string \2 в качестве третьего аргумента:

SELECT REGEXP_REPLACE(str,'(.* )(\d+)(.*)','\2') AS download_speed, 
       REGEXP_REPLACE(str,'(.*\/)(\d+)(.*)','\2') AS upload_speed
  FROM tab

Демо

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