我需要对我的 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了解更多信息。
关于tsql - 在 SQL 中对 IP 地址进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640871/