2015-12-09 14 views
2

我想從https地址中提取兩個字符串集。我使用Oracle 11g,這是我的數據,我的解決方案:如何從Oracle SQL中的https地址解析數字?

with mcte as (
select 'https://id.adsf.fi/dfad2/services/org/Organizations/9884752-6/2542595-3/Corlsdf-asdf/Corlsdf/MOB50202282' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/2435213-2/Corlsdf-asdf/Corlsdf/KVY239229' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0/6356324-0' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0/6356324-0/' as addr from dual 
) 
select addr, 
     REGEXP_SUBSTR(addr, '(Organizations\/)(\d+)', 1, 1, null, 2) AS num1, 
     REGEXP_SUBSTR(addr, '(Organizations\/)(\d+)', 1, 1, null, 3) AS num2 
from mcte 
; 

這不會導致正確的設置應該是這樣的NUM1和NUM2

+----------------------------------------------------------------------------------------------------------+-----------+-----------+ 
|             id             | num1 | num2 | 
+----------------------------------------------------------------------------------------------------------+-----------+-----------+ 
| https://id.adsf.fi/dfad2/services/org/Organizations/9884752-6/2542595-3/Corlsdf-asdf/Corlsdf/MOB50202282 | 9884752-6 | 2542595-3 | 
| https://id.asdf.fi/dfad2/services/org/Organizations/2435213-2/Corlsdf-asdf/Corlsdf/KVY239229    | 2435213-2 | NULL  | 
| https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0           | 6356334-0 | NULL  | 
| https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0/6356324-0         | 6356334-0 | 6356324-0 | 
| https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0/6356324-0/         | 6356334-0 | 6356324-0 | 
+----------------------------------------------------------------------------------------------------------+-----------+-----------+ 

我怎樣才能做到這一點?

回答

1

你的表情是不正確/完整:

  1. 您正在尋找唯一數字(\d),而不是尋找減號也([0-9-])。
  2. 他們缺少你正在尋找的第二個數字。

它應該是這個:

REGEXP_SUBSTR(addr, '(Organizations\/)([0-9-]+)', 1, 1, null, 2) AS num1, 
REGEXP_SUBSTR(addr, '(Organizations\/)([0-9-]+)\/([0-9-]+)', 1, 1, null, 3) AS num2 
1

嘗試以下操作:

REGEXP_SUBSTR(addr, '(Organizations\/)([^\/]+)', 1, 1, null, 2) AS num1, 
REGEXP_SUBSTR(addr, '(Organizations\/)([^\/]+\/)([0-9\-]+)', 1, 1, null, 3) AS num2 

首先是:跳過Organizations/和而符號不/採取一切。

二是:跳過Organizations/..../然後取連續數字和-

這裏是撥弄http://sqlfiddle.com/#!4/9eecb7d/12905

1

第四個參數,以REGEXP_SUBSTR是發生參數。這應該讓你在哪裏,你需要去:

with mcte as (
select 'https://id.adsf.fi/dfad2/services/org/Organizations/9884752-6/2542595-3/Corlsdf-asdf/Corlsdf/MOB50202282' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/2435213-2/Corlsdf-asdf/Corlsdf/KVY239229' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0/6356324-0' as addr from dual 
union all 
select 'https://id.asdf.fi/dfad2/services/org/Organizations/6356334-0/6356324-0/' as addr from dual 
) 
select REGEXP_SUBSTR(addr, '/([[:digit:]\-])+', 1, 1) AS p1, 
     REGEXP_SUBSTR(addr, '/([[:digit:]\-])+', 1, 2) AS p2 
from mcte; 

結果:

p1   p2 
/9884752-6 /2542595-3 
/2435213-2 
/6356334-0 
/6356334-0 /6356324-0 
/6356334-0 /6356324-0