在TSQL中对IP地址进行排序

在TSQL中对IP地址进行排序,tsql,sorting,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 有人能帮我吗?这是您在MySQL中使用的INET_ATON()函数,而t-SQL中不存在该函数。虽然它不

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

有人能帮我吗?

这是您在MySQL中使用的INET_ATON()函数,而t-SQL中不存在该函数。

虽然它不是为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)

有关更多信息,请参阅。

将IP地址存储为普通32位整数(保证它们适合)并对其进行排序。对于IPv6,请改为转换为128位整数。

另请参阅,谢谢,为我节省了大量时间。