Как выбрать несколько IP-адресов из базы данных ip2location?

#sql #postgresql

#sql #postgresql

Вопрос:

Я пытаюсь выбрать IP-информацию для нескольких IP-адресов из базы данных, где IP-адреса хранятся в диапазонах. Простая строка в БД выглядит следующим образом:

  ip_from  |  ip_to   | country_code | city_name
---------- ---------- -------------- -----------
        0 | 16777215 | -            | -
 16777216 | 16777471 | AU           | Brisbane
 16777472 | 16778239 | CN           | Fuzhou
 

Мне нужно написать запрос, в котором я могу передать список IP-адресов в виде целого числа, например (16777221, 16777490), и он должен вернуть результат, подобный следующему:

  ip       | country_code | city_name
---------- -------------- -----------
 16777221 | AU           | Brisbane
 16777490 | CN           | Fuzhou
 

В настоящее время я получаю информацию для одного IP-адреса со следующим запросом:
select * from ip_table where 16777221 <= ip_to order by ip_to limit 1;

Ответ №1:

Вы можете присоединиться к набору, сгенерированному с VALUES помощью .

 SELECT v.ip,
       i.country_code,
       i.city_name
       FROM (VALUES (16777221),
                    (16777490)) v (ip)
            LEFT JOIN ip_table i
                      ON i.ip_from <= v.ip
                         AND i.ip_to >= v.ip;
 

db<>скрипка

Если вы хотите исключить строки, в которых не ip_table было найдено совпадений, измените левое соединение на внутреннее соединение.

Ответ №2:

Используйте ключевое слово IN .

ВЫБЕРИТЕ * ИЗ ip_table, ГДЕ ip_to В (16777221, 16777490)