Salut ,
je suis en oracle 10g
j'aime comparer deux adresse IP jusqu'au 3 eme point .
par exemple 192.168.12.15 et 192.168.12.19 sont egaux .
merci d'avance pour votre aide
Version imprimable
Salut ,
je suis en oracle 10g
j'aime comparer deux adresse IP jusqu'au 3 eme point .
par exemple 192.168.12.15 et 192.168.12.19 sont egaux .
merci d'avance pour votre aide
utilises substr et instr
ou bien
Code:
1
2
3
4
5
6 SELECT 1 FROM DUAL WHERE REGEXP_SUBSTR (:ip, '[^.]+', 1, 1) = REGEXP_SUBSTR (:ip1, '[^.]+', 1, 1) AND REGEXP_SUBSTR (:ip, '[^.]+', 1, 2) = REGEXP_SUBSTR (:ip1, '[^.]+', 1, 2) AND REGEXP_SUBSTR (:ip, '[^.]+', 1, 3) = REGEXP_SUBSTR (:ip1, '[^.]+', 1, 3)
Code:
1
2
3
4
5
6
7
8
9 SQL> select regexp_substr('192.168.12.15','\d{1,3}\.\d{1,3}\.\d{1,3}\',1) a, 2 regexp_substr('192.168.12.19','\d{1,3}\.\d{1,3}\.\d{1,3}\',1) b 3 from dual 4 ; A B -------------------------------- -------------------------------- 192.168.12 192.168.12
C'est encore plus simple, mnitu bravo :king:
Pour juste une opération simple comme celle ci, l'utilisation du regexpr n'est pas super utile
ouCode:
1
2
3 SELECT SUBSTR('192.168.12.15',1, INSTR('192.168.12.15', '.', -1)-1) a, SUBSTR('192.168.12.19',1, INSTR('192.168.12.19', '.', -1)-1) b FROM dual
Code:
1
2
3 SELECT SUBSTR('192.168.12.15',1, INSTR('192.168.12.15', '.', 1,3)-1) a, SUBSTR('192.168.12.19',1, INSTR('192.168.12.19', '.', 1,3)-1) b FROM dual
MCM: bien sûr regexp n'est pas utile et lent de surcroix...Code:
1
2 where regexp_substr('192.168.12.15','.*\.')=regexp_substr('192.168.12.19','.*\.')
Oui c'est vrai. Sauf que les requêtes ne sont pas vraiment équivalentes:
Je pense que c'est à celui qui fera l'emploie de décider de quoi il a vraiment besoin.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SQL> with data as 2 ( 3 Select '192.168.12.15' ip From dual 4 Union ALL 5 Select 'AAA.BBB.CC.DDD' ip From dual 6 ) 7 Select SUBSTR(ip,1, INSTR('192.168.12.15', '.', -1)-1) MCM, 8 regexp_substr(ip,'.*\.') Laurent, 9 regexp_substr(ip,'\d{1,3}\.\d{1,3}\.\d{1,3}\',1) Marius 10 From data 11 / MCM LAURENT MARIUS ---------- -------------- -------------- 192.168.12 192.168.12. 192.168.12 AAA.BBB.CC AAA.BBB.CC.
comme il a besoin d'une IP, 999.999.999.999 et AAA.BBB.CCC.DDD ne devrait pas exister, non?
Salut Laurent,
Ca peut s'améliorer tu le sais bien. Voila un lien qui discute le cas que tu évoque.
oui oui, je vois ça, mais veut-on controler si les adresses sont valables (est-ce que 000.0.00.255 est une adresse valable?) ou si les adresses A et B sont identiques jusqu'au 3e point?
Bon, pour vérifier si les adresses sont dans le même réseau je verrais plutôt :
Code:
1
2
3
4
5
6 create table t as select '192.168.12.15' ip1, '255.255.255.0' netmask1, '192.168.12.19' ip2, '255.255.255.0' netmask2 from dual union all select '10.1.2.3' ip1, '255.0.0.0' netmask1, '10.200.100.0' ip2, '255.0.0.0' netmask2 from dual union all select '200.1.2.30' ip1, '255.255.255.192' netmask1, '200.1.2.80' ip2, '255.255.255.192' netmask2 from dual ;
Code:
1
2
3
4
5
6
7
8
9 select * from t where bitand(regexp_substr(ip1,'\d+',1,1),regexp_substr(netmask1,'\d+',1,1)) = bitand(regexp_substr(ip2,'\d+',1,1),regexp_substr(netmask2,'\d+',1,1)) and bitand(regexp_substr(ip1,'\d+',1,2),regexp_substr(netmask1,'\d+',1,2)) = bitand(regexp_substr(ip2,'\d+',1,2),regexp_substr(netmask2,'\d+',1,2)) and bitand(regexp_substr(ip1,'\d+',1,3),regexp_substr(netmask1,'\d+',1,3)) = bitand(regexp_substr(ip2,'\d+',1,3),regexp_substr(netmask2,'\d+',1,3)) and bitand(regexp_substr(ip1,'\d+',1,4),regexp_substr(netmask1,'\d+',1,4)) = bitand(regexp_substr(ip2,'\d+',1,4),regexp_substr(netmask2,'\d+',1,4));
Code:
1
2
3
4IP1 NETMASK1 IP2 NETMASK2 ------------- --------------- ------------- --------------- 192.168.12.15 255.255.255.0 192.168.12.19 255.255.255.0 10.1.2.3 255.0.0.0 10.200.100.0 255.0.0.0
Sacré Laurent! Faut toujours que tu nous sortes des soluces délirantes de derrière les fagots :mouarf:
Ah, ben oui.
Quel con de pas y avoir pensé ! :lol:
Tirez pas :)Code:
1
2
3
4
5
6
7
8
9 SQL> r 1 SELECT chartorowid('192.165.26.19') ip1, 2 chartorowid('192.165.26.15') ip2 3* from dual IP1 IP2 ------------------ ------------------ 00000192.0165.0026 00000192.0165.0026
Alors là.. Chapeau bas !
Quel moyen détourné !
Ca allors!
Bref, le point décimal n'est que'un séparateur, et peut être que on devez extraire les valeurs, n'est pas vrai ?
Tiens, ça me rappele quelque choseCitation:
IPv4 addresses are usually represented in dotted-decimal notation (four numbers, each ranging from 0 to 255, separated by dots, e.g. 147.132.42.18).
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 SQL> WITH t AS ( 2 SELECT '192.168.12.15' c FROM dual 3 ) 4 SELECT to_number(extractvalue(COLUMN_VALUE,'/x')) AS liste 5 FROM t, 6 TABLE( xmlsequence(EXTRACT(XMLTYPE('<list><x>'|| REPLACE(c,'.','</x><x>') ||'</x></list>') 7 , '/list/x'))) 8 Where rownum <= 3 9 / LISTE ---------- 192 168 12
Et donc il semblerait que ce n’est pas la même adresse ip.Code:
1
2
3
4
5
6
7
8
9 SQL> r 1 Select rtrim('192.168.12.15','0123456789') ip1, 2 rtrim('192.168.012.15','0123456789') ip2 3* From dual IP1 IP2 ----------- ------------ 192.168.12. 192.168.012.
Par contre traceroute n’est pas de même avis.
Et voilà que sur ce coup la chartorowid se comporte mieux.Code:
1
2
3
4
5
6
7
8 traceroute 172.31.2.101 ... 2 172.31.2.101 (172.31.2.101) 24 ms * 193 ms traceroute 172.31.002.101 ... 2 172.31.2.101 (172.31.2.101) 26 ms * 14 ms
[Avertissement]
Pour les âmes sensibles du net : il ne faut pas utiliser chartorowid comme je viens de le faire ici.
[/Avertissement]
Petit rappel de la questionCode:
1
2
3
4
5
6
7
8
9 SQL> r 1 Select chartorowid('192.168.12.15') ip1, 2 chartorowid('192.168.012.15') ip2 3* From dual IP1 IP2 ------------------ ------------------ 00000192.0168.0012 00000192.0168.0012
Citation:
j'aime comparer deux adresse IP jusqu'au 3 eme point .
:aie:
Il fait quel temps chez vous :frenchy:Code:
1
2
3
4
5 $ traceroute 172.031.2.101 traceroute to 172.031.2.101 (172.25.2.101), 30 hops max, 40 byte packets $ traceroute 172.31.2.101 traceroute to 172.31.2.101 (172.31.2.101), 30 hops max, 40 byte packets