用于提取数据的oracle regexp\u substr

a8jjtwal  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(421)

我正在尝试从字符串中提取下载和上传的速度数字,无法实现,请帮助
输入字符串: My ADSL 14Mbps/2M speed 预期产量:

Download_speed = 14
Upload_speed = 2

我的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
p3rjfoxz

p3rjfoxz1#

你可以用

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

看到小提琴了吗
这个 (\d+)Mbps/\d+M 模式匹配并将任何一个或多个数字捕获到组1中,然后 Mbps/ ,然后是1+位数,然后是 M (组值是在最后一个 1 参数)。
这个 \d+Mbps/(\d+)M 模式匹配任何一个或多个数字,然后 Mbps/ ,然后将1+个数字捕获到组1中,然后 M .
请参阅regex#1演示和regex#2演示。

rsaldnfx

rsaldnfx2#

我想如果你只想得到数字,我会这样做:

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值

arknldoa

arknldoa3#

你只需要提取数字序列 (\d+) 从位置开始 1 :
下载事件 1 数字序列编码
对于上载事件 2 数字序列。
以下是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>
9udxz4iz

9udxz4iz4#

一种选择是使用 REGEXP_REPLACE() 搜索带有替换字符串的数字字符 \2 作为第三个论点:

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

演示

相关问题