数据库 |邮政系统 |如何检查 IP 是否在 IP 列表或范围内
DB | Postgres | How to check if IP is in a list of IPs or a range
我有一个 table,它有一个包含 IP、IP 或范围(例如 1.1.1.1/24)的 TEXT 列。
如果有多个 IP,IP 将由 @##@ 分隔
例如 1.1.1.1@##@2.2.2.2
table 有 4 行:
ip
------------------
1.1.1.1
1.1.1.1@##@2.2.2.2
1.1.1.1/24
3.3.3.3
2.2.2.2
我想获取所有包含 ip 1.1.1.1 或 3.3.3.3 的行,这意味着我想获取前 4 行。
(1.1.1.1,1.1.1.1@##@2.2.2.2,1.1.1.1/24,3.3.3.3)
我在另一个堆栈溢出问题中找到了这个解决方案:
select inet '192.168.1.5' << 任意 (array['192.168.1/24', '10/8']::inet[]);
但我无法理解如何让它适用于我的特定 table 并获得所有前 4 行。
请帮忙
提前致谢
我认为这符合您的要求:
select t.*
from t
where '1.1.1.1'::inet <<= any(regexp_split_to_array(t.ips, '@##@')::inet[])
Here 是一个 db<>fiddle.
我有一个 table,它有一个包含 IP、IP 或范围(例如 1.1.1.1/24)的 TEXT 列。 如果有多个 IP,IP 将由 @##@ 分隔 例如 1.1.1.1@##@2.2.2.2
table 有 4 行:
ip
------------------
1.1.1.1
1.1.1.1@##@2.2.2.2
1.1.1.1/24
3.3.3.3
2.2.2.2
我想获取所有包含 ip 1.1.1.1 或 3.3.3.3 的行,这意味着我想获取前 4 行。 (1.1.1.1,1.1.1.1@##@2.2.2.2,1.1.1.1/24,3.3.3.3)
我在另一个堆栈溢出问题中找到了这个解决方案: select inet '192.168.1.5' << 任意 (array['192.168.1/24', '10/8']::inet[]);
但我无法理解如何让它适用于我的特定 table 并获得所有前 4 行。
请帮忙 提前致谢
我认为这符合您的要求:
select t.*
from t
where '1.1.1.1'::inet <<= any(regexp_split_to_array(t.ips, '@##@')::inet[])
Here 是一个 db<>fiddle.