2014-12-02 114 views

回答

6
  • 使用regexp_substr提取四個八位位組的地址。
  • 通過將八位組移回原始位置來重構該值。

正則表達式可能相對昂貴,所以如果你這樣做了很多,你可能會考慮在表中緩存IP地址的數值。

with addr as (select '239.255.2.51' ip from dual) 
select ip, to_number(regexp_substr(ip, '\d+', 1, 1)) * 16777216 + 
      to_number(regexp_substr(ip, '\d+', 1, 2)) * 65536 + 
      to_number(regexp_substr(ip, '\d+', 1, 3)) * 256 + 
      to_number(regexp_substr(ip, '\d+', 1, 4)) n 
    from addr; 

IP      N 
------------- ----------  
239.255.2.51 4026466867 

爲了完整性,下面是如何去其他方式。

with addr as (select 4026466867 n from dual) 
select n, mod(trunc(n/16777216),256) ||'.'|| 
      mod(trunc(n/65536), 256) ||'.'|| 
      mod(trunc(n/256),  256) ||'.'|| 
      mod(n,    256) ip 
from addr; 

     N IP                                                                
---------- ------------ 
4026466867 239.255.2.51