2010-03-25 15 views
0

Étant donné une table contenant les adresses IPv4 quad pointillées stockées comme VARCHAR(15), par exemple:récurage adresses IPv4-quadruplet dans SQL

 ipv4 
-------------- 
172.16.1.100 
172.16.50.5 
172.30.29.28 

ce qui est un moyen pratique de SELECT tous "ipv4" champs avec les deux derniers octets épurés, de sorte que ce qui précède deviendrait:

ipv4 
------------ 
172.16.x.y 
172.16.x.y 
172.30.x.y 

Target RDBMS est postgresql 8.4, mais le plus portable, mieux c'est!

Merci.

MISE À JOUR: alors que j'apprécie (et ne upvote) réponses lisse INET/CIDR, Je cherche à produire une chaîne sortie avec des caractères non numériques substitués pour les deux derniers octets. (Et, encore une fois, plus portable le mieux!)

Répondre

3

Pour postgres:

select regexp_replace('172.16.1.100', E'(.\\d+){2}$', '.x.y'); 
+2

mes postgres m'a dit d'écrire que de sélectionner regexp_replace ('172.16.1.100', E '(\\ d +) {2} $ ',' .x.y '); – Unreason

+0

+1. Ceci est similaire à, mais une nette amélioration par rapport à mon approche originale, qui était: 'SUBSTRING (" ipv4 "FROM E '^ (([1-9] [0-9] {0,2} \.) {2 }) ') || 'x.y'' Merci! – pilcrow

+0

N'utilisez pas une regex lorsque vous n'en avez pas besoin. Utilisez simplement les fonctions et les opérateurs du réseau Propper. –

1

conventionnelle est de convertir le type de colonne à inet/cidr

EDIT: Avec ce type de données natif, il y a un certain nombre specific fonctions qui fonctionnent beaucoup mieux que toute manipulation de chaîne.

+0

Merci, goran. En fait, les enregistrements source sont de type INET. Mais comment cela m'aiderait-il à cacher les deux derniers octets? (Il me semble que j'ai besoin de convertir en un type de chaîne et de me déplacer à partir de là.) – pilcrow

3

Si vous utilisez le type Postgres inet, vous pouvez le faire avec les opérateurs inet, par exemple. <<= signifie «est contenu dans». Je soupçonne que quelque chose lik ce qui suit va faire ce que vous avez besoin:

select my_ipaddress & inet '255.255.0.0' from my_ip_table; 

Manuel de référence:. http://www.postgresql.org/docs/8.4/static/functions-net.html

+0

+1 Ce n'est pas mal, brisant les deux derniers octets à zéro ... – pilcrow

+0

Voici comment vous le faites! –