我需要将我的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 :(得分: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。
答案 1 :(得分:1)
这是你在MySQL中使用INET_ATON()函数的东西,而对于T-SQL see this question for examples of how it can be done则不存在。
答案 2 :(得分:1)
将IP地址存储为普通的32位整数(保证它们适合)并对它们进行排序。对于IPv6,转换为128位整数。