Postgress | SQL | Получить строку, только если su bnet является частью заданного списка IP-адресов - PullRequest
0 голосов
/ 05 августа 2020

У меня есть таблица с текстовым столбцом, содержащая ip с su bnet

| ip
-------------
| 1.1.1.1/30

, когда вы конвертируете 1.1.1.1/30 в список ip, вы получаете:

1.1.1.0
1.1.1.1
1.1.1.2
1.1.1.3

Я хочу запустить sql в этой таблице и каким-то образом передать список IP-адресов как часть «где» или чего-то еще, и получить эту строку только в том случае, если список предоставленных мной IP-адресов содержит IP-адреса диапазона в строка.

означает,

where ('1.1.1.0','1.1.1.1) 

-> Я не получу строку

, но:

where ('1.1.1.0','1.1.1.1,1.1.1.2,1.1.1.3) 

-> I получит строку

, но:

where ('1.1.1.0','1.1.1.1,1.1.1.2,1.1.1.3,1.1.1.4,1.1.1.5) 

-> Я получу строку

Есть ли способ сделать это?

1 Ответ

1 голос
/ 05 августа 2020

Вы должны расширить inet до всех его host значений, а затем использовать сдерживание для выполнения sh этого:

with blowout as (
  select t.ip, array_agg(host(network(t.ip::inet) + gs.n)) as all_ips
    from t
   cross join lateral 
         generate_series(0, broadcast(t.ip::inet) - network(t.ip::inet)) as gs(n)
   group by t.ip;
)
select *
  from blowout
 where all_ips <@ array['1.1.1.0', '1.1.1.1', '1.1.1.2', 
                        '1.1.1.3', '1.1.1.4', '1.1.1.5']::text[] 
;

Поскольку вы не используете никаких специальных функций inet при сравнении лучше всего проводить сравнения, используя text.

...