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
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
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
ou bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
Publications: http://schelabi.developpez.com/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Publications: http://schelabi.developpez.com/
Pour juste une opération simple comme celle ci, l'utilisation du regexpr n'est pas super utile
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
MCM: bien sûr regexp n'est pas utile et lent de surcroix...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
encore plus simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 rtrim('192.168.12.15','0123456789')= rtrim('192.168.12.19','0123456789')
Sacré Laurent! Faut toujours que tu nous sortes des soluces délirantes de derrière les fagots
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
Ah, ben oui.
Quel con de pas y avoir pensé !
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
Tirez pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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é !
More Code : More Bugs. Less Code : Less Bugs
Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP
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 choseIPv4 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 question
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
j'aime comparer deux adresse IP jusqu'au 3 eme point .
Il fait quel temps chez vous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager