我需要对我的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 –