我想获得一个列表IP地址,其最后3位数不在0到200的范围内。我尝试使用REGEXP_LIKE,如下所示。但它给了我错误的结果。
select * from ip_data
where REGEXP_LIKE(substr(ip_address,instr(ip_address,'.',1,3)+1),'[^0-200]');
似乎每个数字都与0-200个数字相匹配。
我想只使用REGEXP_LIKE,因为我要从另一个表格中取出范围,格式为[0-200]。
任何建议都会有很大的帮助。
答案 0 :(得分:2)
使用 REGEXP_SUBSTR :
SQL> WITH DATA AS(
2 SELECT '127.0.0.1' ip FROM dual UNION ALL
3 SELECT '127.0.0.201' ip FROM dual
4 )
5 SELECT * FROM DATA
6 WHERE REGEXP_SUBSTR(ip,'[[:digit:]]{1,3}',1, 4)
7 NOT BETWEEN 0 AND 200
8 /
IP
-----------
127.0.0.201
SQL>
使用简单的 SUBSTR :
SQL> WITH DATA AS(
2 SELECT '127.0.0.1' ip FROM dual UNION ALL
3 SELECT '127.0.0.201' ip FROM dual
4 )
5 SELECT * FROM DATA
6 WHERE to_number(substr(ip,instr(ip,'.',1,3)+1))
7 NOT BETWEEN 0 AND 200
8 /
IP
-----------
127.0.0.201
SQL>
我会采用简单的SUBSTR方法,因为它占用资源较少,CPU利用率较低,因此性能更佳。
答案 1 :(得分:1)
您不需要正则表达式:
to_number(substr(ip_address,instr(ip_address,'.',1,3)+1)) not between 0 and 200
答案 2 :(得分:0)
这样的事情应该有效:
select ip_address from ip_data
where NOT REGEXP_LIKE(ip_address,'\.(([0-9])|([1-9][0-9])|([1][0-9][0-9])|(200))$');