#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;
Если вы хотите исключить строки, в которых не ip_table
было найдено совпадений, измените левое соединение на внутреннее соединение.
Ответ №2:
Используйте ключевое слово IN .
ВЫБЕРИТЕ * ИЗ ip_table, ГДЕ ip_to В (16777221, 16777490)