Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 在oracle sql中计算IP地址十进制表示_Oracle11g_Ip Address - Fatal编程技术网

Oracle11g 在oracle sql中计算IP地址十进制表示

Oracle11g 在oracle sql中计算IP地址十进制表示,oracle11g,ip-address,Oracle11g,Ip Address,我想在SQL中获取给定IP地址的十进制值 示例192.168.0.0其十进制表示为3232235520 我正在使用Oracle11g,我提出了上述方法 使用ult_raw.cast_from_binary_integer将八位字节转换为二进制表示,但内部二进制转换为十六进制表示。因此,内部查询的输出基本上是八位字节的十六进制表示。 十六进制表示法是通过将4个二进制字符组合在一起获得的,例如10002=816 因此,获取十进制值100010002等于获取8816的值 我已经附加了十六进制表示,用c

我想在SQL中获取给定IP地址的十进制值 示例192.168.0.0其十进制表示为3232235520

我正在使用Oracle11g,我提出了上述方法

使用ult_raw.cast_from_binary_integer将八位字节转换为二进制表示,但内部二进制转换为十六进制表示。因此,内部查询的输出基本上是八位字节的十六进制表示。 十六进制表示法是通过将4个二进制字符组合在一起获得的,例如10002=816 因此,获取十进制值100010002等于获取8816的值 我已经附加了十六进制表示,用cnt列保留八位字节的顺序,并用LISTAGG对结果进行聚类 更新


我正在使用listag和connectby子句。当我尝试转换1000条记录时,这是否有任何性能问题。正如建议的那样,它简单易读,但没有数学解释。这使用了PL/SQL函数,我将把它作为我的最后手段

SELECT
TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,1))*POWER(2,24)
+ TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,2))*POWER(2,16)
+ TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,3))*POWER(2,8)
+ TO_NUMBER(REGEXP_SUBSTR('127.0.0.1','\w+',1,4))*POWER(2,0) IP
FROM
DUAL;
假设我的IPADDRESS=255.127.72.1

二进制表示将是 11111111.01111111.01001000.00000001

我能够用下面的方法消除子查询

select sum(regexp_substr('255.127.72.1', '\d+', 1, rownum) * POWER(2, 32 - 8*rownum))  as binary1
          from dual connect by rownum <= 4

你如何定义“更好”?从示例地址获取相同的十进制值。或者具有双向转换的函数,这在某些情况下可能会很有用。 converting to decimal first octet 1.231 + 1.230 + 1.229 + 1.228 + 1.227 + 1.226 + 1.225 + 1.224 = (1.27 + 1.26 + 1.25 + 1.24 + 1.23 + 1.22 + 1.21 + 1.1).224 = (28 - 1).224 = (255).224 second octet 0.223 + 1.222 + 1.221 + 1.220 + 1.219 + 1.218 + 1.217 + 1.216 = (0.27 + 1.26 + 1.25 + 1.24 + 1.23 + 1.22 + 1.21 + 1.1).216 = (27 - 1).216 = (127).216 third octet 0.215 + 1.214 + 0.213 + 0.212 + 1.211 + 0.210 + 0.29 + 0.28 = (0.27 + 1.26 + 0.25 + 0.24 + 1.23 + 0.22 + 0.21 + 0.1).216 = (26 + 1.23).216 = (72).216 similarly the last octet
select sum(regexp_substr('255.127.72.1', '\d+', 1, rownum) * POWER(2, 32 - 8*rownum))  as binary1
          from dual connect by rownum <= 4