SQL查询REGEXP_SUBSTR IP范围

时间:2013-11-25 07:17:55

标签: sql regex oracle

我有一个应用程序GUI,允许您输入IP范围并执行查询以提取仅具有属于该范围内的clientIP的记录。我一直在努力自动化这个功能,并且大部分都在工作,但我很难理解regex_subst语法。这是我从Oracle会话中提取的查询的一部分,我想要使用IP硬编码或通过变量插入值。

AND REGEXP_LIKE(m.CLIENTIP, '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$') 
AND CAST(REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1, 4) AS NUMBER) BETWEEN :22  AND :23 AND CAST(REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1, 3) AS NUMBER) BETWEEN :24  AND :25  
AND CAST(REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1, 2) AS NUMBER) BETWEEN :26  AND :27  AND CAST(REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1) AS NUMBER) BETWEEN :28  AND :29) 

如果我想在10.35.0.0之间找到记录 - > 10.35.255.255,这些值会在哪里插入上面的语法?

1 个答案:

答案 0 :(得分:1)

REGEXP_SUBSTR(m.CLIENTIP,'[0-9] {1,3}',1,2)表示提取一组1-3个数字,从第1位开始搜索并匹配第2该群体的发生。

所以,如果你的m.CLIENTIP是10.35.23.12,

  • REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1, 4)将提取12
  • REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1, 3)将提取23
  • REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1, 2)将提取35
  • REGEXP_SUBSTR(m.CLIENTIP,'[0-9]{1,3}',1)将提取10(此处省略第四个参数,默认情况下视为1)

要回答您的问题,

  • :22应为0
  • :23应为255
  • :24应为0
  • :25应为255
  • :26应该是35
  • :27应该是35
  • :28应为10
  • :29应为10