2011-07-10 43 views
2

我需要对我的IP列表进行排序。问题是我希望它们按照第一部分中的值排序,然后是第二部分等等。排序TSQL中的IP地址

MYTABLE 

DATA 
20.1.2.1 
100.1.1.1 
20.1.10.1 
80.8.8.8 

此代码不会下令IP正确

SELECT * FROM MYTABLE ORDER BY DATA 

我希望能得到这样的:

20.1.2.1 
20.1.10.1 
80.8.8.8 
100.1.1.1 

谁能帮助我?

+0

另请参阅http://stackoverflow.com/questions/6690101/storing-ip-addresses-in-microsoft-sql-server –

回答

6

虽然它不是为IP地址设计的,但您可以使用PARSENAME通过在期间分割字符串来分割字符串。

虽然我看到你有一个冒号而不是一个句点的IP地址,所以你只需要用句点替换所有的冒号。

因此,你可以这样做:

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) 

您可以在查询分析器中抛出这个以确认它的工作原理:

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) 

更多信息,请参见MSDN link

+0

谢谢,节省了我的时间。 – Zapnologica

1

将IP地址存储为普通的32位整数(确保它们适合)并对其进行排序。对于IPv6转换为128位整数。