2011-07-10 3 views
2

J'ai besoin que ma liste IP soit triée. Le problème est que je les veux triés après la valeur dans la première partie, puis la deuxième partie et ainsi de suite.Tri des adresses IP dans TSQL

MYTABLE 

DATA 
20.1.2.1 
100.1.1.1 
20.1.10.1 
80.8.8.8 

Ce code ne commande l'adresse IP correcte

SELECT * FROM MYTABLE ORDER BY DATA 

Je n'étais pas l'espoir d'obtenir quelque chose comme ceci:

20.1.2.1 
20.1.10.1 
80.8.8.8 
100.1.1.1 

Quelqu'un peut-il me aider?

+0

Voir aussi http://stackoverflow.com/questions/6690101/storing-ip-addresses-in-microsoft-sql-server –

Répondre

6

Bien qu'il n'ait pas été conçu pour les adresses IP, vous pouvez utiliser PARSENAME pour diviser une chaîne en sections en divisant la période.

Je vois bien que vous avez des adresses IP avec un deux-points au lieu d'un point, donc vous auriez juste besoin de remplacer tous vos deux-points par un point.

Ainsi, vous pouvez faire:

SELECT * 
FROM MyTable 
ORDER BY CAST(PARSENAME(REPLACE(Data, ':', '.'), 4) as int), 
    CAST(PARSENAME(REPLACE(Data, ':', '.'), 3) as int), 
    CAST(PARSENAME(REPLACE(Data, ':', '.'), 2) as int), 
    CAST(PARSENAME(REPLACE(Data, ':', '.'), 1) as int) 

Vous pouvez jeter cela dans l'Analyseur de requêtes pour confirmer cela fonctionne:

SELECT * 
FROM (
    SELECT '20:1:2:1' AS Data UNION 
    SELECT '100:1:1:1' UNION 
    SELECT '20:1:10:1' UNION 
    SELECT '80:8:8:8' 
) X 
ORDER BY CAST(PARSENAME(REPLACE(Data, ':', '.'), 4) as int), 
    CAST(PARSENAME(REPLACE(Data, ':', '.'), 3) as int), 
    CAST(PARSENAME(REPLACE(Data, ':', '.'), 2) as int), 
    CAST(PARSENAME(REPLACE(Data, ':', '.'), 1) as int) 

Voir la MSDN link pour plus d'informations.

+0

Merci, Cela m'a sauvé beaucoup de temps. – Zapnologica

1

Stockez les adresses IP sous la forme d'entiers 32 bits simples (c'est garanti qu'ils s'adaptent) et triez-les. Pour IPv6, convertissez plutôt en un entier de 128 bits.

Questions connexes