我需要對我的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
誰能幫助我?
我需要對我的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
誰能幫助我?
雖然它不是爲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。
謝謝,節省了我的時間。 – Zapnologica
這是你在MySQL中使用INET_ATON()函數的東西,而對於T-SQL,see this question for examples of how it can be done則不存在。
將IP地址存儲爲普通的32位整數(確保它們適合)並對其進行排序。對於IPv6轉換爲128位整數。
另請參閱http://stackoverflow.com/questions/6690101/storing-ip-addresses-in-microsoft-sql-server –