在SQL中对IP地址进行排序

时间:2011-07-10 11:43:13

标签: tsql sorting

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

任何人都可以帮助我吗?

3 个答案:

答案 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位整数。