Проверка вхождения IP адреса в диапазон средствами SQL или PL/SQL?

Привет, други.


Подскажите пож-та, как средствами SQL (предпочтительно) или PL/SQL реализовать проверку вхождения конкретных IP адресов в тот или иной диапазон?


Проще говоря, надо определить, к какой подсети относится конкретный IP адрес:


Есть таблица ip_networks формата

RANGE_BEGIN RANGE_END RANGE_NAME<br/>
10.160.1.0 10.160.1.125 MSK<br/>
10.160.1.126 10.160.1.254 SPB



… и таких еще много…


и нужно выводить в select-запрос значение поля RANGE_NAME для каждого IP адреса из длинного списка.


В голове крутится что-то очень длинное с использованием BETWEEN, FOR и CASE, но подозреваю, что эта задача как-то элементарнее должна решаться…


Очень на вас надеюсь…
  • Вопрос задан
  • 5896 просмотров
Решения вопроса 1
bigbaraboom
@bigbaraboom
Если поля имеют тип inet, то так:

SELECT * FROM ips WHERE inet '10.160.1.15' >= RANGE_BEGIN AND inet '10.160.1.15' <= RANGE_END ;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Wott
@Wott
Ну сколько можно!

Делаете ip — unsigned int
запись — нижний ip из диапазона
выборку — первый из отсортированного списка по возрастанию, больше или равен нижнему ip из диапазона
при этом хорошо и быстро используется индекс

Если mysql с этим справляете, то oracle должен также отлично работать

единственный недостаток — нужно незанятые блоки также прописывать, но это оффлайновая операция и делается просто.
Правда для отдельного региона будет их много. Для world wide будет все просто отлично.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы