2013-03-28 2 views
1

Я нахожусь в базе данных postgresql 8.3. Я пытаюсь выяснить, где ошибка в запросе ниже. Я пытаюсь создать запрос только для выбора source_ips и destination_ips, которые являются частными адресами.SQL-запрос, выбирающий общедоступный IP-адрес

По какой-либо причине один из адресов, который берется в следующем запросе, является адресом 208.117.252.39, который не является частным адресом.

Есть ли что-то не так с логикой в ​​нижеследующем запросе, чтобы заставить его выбирать общедоступные IP-адреса?

select source_ip, destination_ip 
from ip_table 
where 
    (
    inet '10/8' >> source_ip 
    or inet '192.168/16' >> source_ip 
    or source_ip >= inet '172.16/16' and source_ip < inet '172.32/16' 
    ) 
    and inet '10/8' >> destination_ip 
    or inet '192.168/16' >> destination_ip 
+0

Это то же самое, если вы меняете> = к >> и < to >>? –

+0

Для большей ясности попробуйте заменить «source_ip> = inet '172.16/16' и source_ip > source_ip". Этот частный диапазон представлен как/12 CIDR, и его не нужно обрабатывать специально. – hoxworth

ответ

1

Вы должны соответствующим образом группировать конечные условия. Прямо сейчас, последний "или" игнорирует все условия source_ip.

Структура запроса как такового:

select source_ip, destination_ip 
from ip_table 
where 
(
    inet '10/8' >> source_ip 
    or inet '192.168/16' >> source_ip 
    or inet '172.16/12' >> source_ip 
) 
and (
    inet '10/8' >> destination_ip 
    or inet '192.168/16' >> destination_ip 
    or inet '172.16/12' >> destination_ip 
); 

Обратите внимание на пункт назначения сгруппированы вместе.

1

Поскольку операция and имеет приоритет над or, у вас отсутствует скобка. Ваш запрос эквивалентен:

select source_ip, destination_ip 
from ip_table 
where 
    (
     (
     inet '10/8' >> source_ip 
     or inet '192.168/16' >> source_ip 
     or source_ip >= inet '172.16/16' and source_ip < inet '172.32/16' 
     ) 
     and inet '10/8' >> destination_ip 
    ) 
    or inet '192.168/16' >> destination_ip 

Правильный вариант:

select source_ip, destination_ip 
from ip_table 
where 
    (
     inet '10/8' >> source_ip 
     or inet '192.168/16' >> source_ip 
     or source_ip >= inet '172.16/16' and source_ip < inet '172.32/16' 
    ) 
    and 
    (
     inet '10/8' >> destination_ip 
     or inet '192.168/16' >> destination_ip 
    ) 
Смежные вопросы