- extraheer de vier octetten van het adres met regexp_substr.
- reconstrueer de waarde door de octetten terug te schuiven naar hun oorspronkelijke posities.
De regexp kan relatief duur zijn, dus als je dit veel doet, zou je kunnen overwegen om de numerieke waarde in je tabel naast het IP-adres te cachen.
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
Voor de volledigheid, hier is hoe je de andere kant op gaat.
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