Сортировка IP-адресов в TSQL - PullRequest
2 голосов
/ 10 июля 2011

Мне нужен отсортированный список IP-адресов.Проблема в том, что я хочу, чтобы они сортировались после значения в первой части, затем во второй части и т. Д.

MYTABLE

DATA
20.1.2.1
100.1.1.1
20.1.10.1
80.8.8.8

Этот код не указывает IP-адрес правильнонадеялся получить что-то вроде этого:

20.1.2.1
20.1.10.1
80.8.8.8
100.1.1.1

Кто-нибудь может мне помочь?

Ответы [ 3 ]

6 голосов
/ 10 июля 2011

Хотя он не предназначен для 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)

Вы можете добавить это в Query Analyzer, чтобы подтвердить, что оно работает:

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 для получения дополнительной информации.

1 голос
/ 10 июля 2011

Сохраните IP-адреса как простые 32-разрядные целые числа (они гарантированно соответствуют) и сортируйте их.Для IPv6 вместо этого преобразуйте в 128-разрядное целое число.

1 голос
/ 10 июля 2011

Это то, что вы бы использовали функцию INET_ATON () в MySQL, хотя этого не существует для T-SQL, см. Этот вопрос для примеров того, как это можно сделать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...