- trích xuất bốn octet của địa chỉ bằng regexp_substr.
- điều chỉnh lại giá trị bằng cách chuyển các octet trở lại vị trí ban đầu của chúng.
Regexp có thể tương đối đắt, vì vậy nếu bạn đang làm việc này nhiều, bạn có thể cân nhắc lưu vào bộ nhớ đệm giá trị số trong bảng của mình cùng với địa chỉ 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
Để hoàn thiện, đây là cách thực hiện theo cách khác.
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