Tôi có một danh sách lớn các mạng con trong một mạng được lưu trữ trong bố cục sau. Điều này được sử dụng như một bảng chủ để lưu trữ các tài sản sẽ được sử dụng để tự động dò tìm trạng thái bằng một tập lệnh Python theo các khoảng thời gian đều đặn.PostgreSQL mở rộng cidr thành các địa chỉ riêng lẻ
CREATE TEMP TABLE tmp_networks (
network cidr PRIMARY KEY
);
Cho phép giả định của nó chứa đầy những giá trị này vì lợi ích của cuộc biểu tình:
- 10.0.0.0/8
- 10.0.1.0/24
- 192.168.0.0/24
Khi tôi chạy tập lệnh, tập lệnh Python sẽ thực hiện truy vấn sau để xóa mọi lớp phủ:
SELECT network
FROM tmp_networks
WHERE NOT EXISTS (
SELECT network
FROM tmp_networks n
WHERE n.network >> tmp_networks.network
);
Điều này rất hữu ích, ngoại trừ một vấn đề nhỏ; Tôi cũng có một danh sách các địa chỉ riêng lẻ cần được loại trừ khỏi công việc. Đây cũng là một bảng trong cơ sở dữ liệu:
CREATE TEMP TABLE tmp_except (
address inet PRIMARY KEY
);
Cho phép giả định này có chứa các địa chỉ sau:
- 10.0.0.100
- 192.168.0.10
Bây giờ, tôi đã thất bại để tìm một phương pháp tốt để loại bỏ các địa chỉ spesific này khỏi đầu ra của cơ sở dữ liệu. Trong suy nghĩ của tôi, giải pháp sẽ là một cái gì đó như:
- chọn tất cả các mạng con
- nếu có địa chỉ ngoại lệ được tìm thấy trong các subnet, chia subnet thành từng miếng nhỏ cho đến khi địa chỉ ngoại lệ duy nhất có thể được loại bỏ và tất cả khác địa chỉ vẫn là
Tôi đã cố gắng điều tra xem điều gì đó như thế này có thể thực hiện trong PostgreSQL thuần túy hay không, nhưng không tìm được cách nào để giải quyết vấn đề này. Bất kỳ con trỏ nào về cách giải quyết vấn đề này?
Kết quả bạn mong đợi từ truy vấn của mình là gì? Có phải luôn luôn * địa chỉ (/ 32) * hoặc là nó * địa chỉ mạng nếu có thể và chỉ địa chỉ, nếu có ngoại lệ *? – Beryllium
Xin chào, tôi ngoại trừ địa chỉ mạng nếu có thể OR/32 nếu không có khối lớn hơn tồn tại. – agnsaft