2011-07-10 74 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位整數。