首页 > 解决方案 > Postgres | 如何根据确切或更少的 IP 列表和简单的文本列表获取行

问题描述

我有一个包含 2 个文本列的表:类型和 IP。它们都可以是单个文本,也可以是用'@##@'分隔的多个文本。另外,ip也可以是1.1.1.1/24等范围

下表

row |type       | ip
-------------------------------------------
1   |red           | 1.1.1.1
2.  |red@##@blue   | 1.1.1.1@##@2.2.2.2
3.  |blue          | 1.1.1.1/32@##@2.2.2.2/32
4.  |yellow        | 1.1.1.1
5.  |red           | 3.3.3.3
6.  |yellow@##@red | 1.1.1.1
7.  |blue          | 1.1.1.1@##@3.3.3.3

我想获取所有类型为红色或蓝色或两者的行(确切地说是红色和蓝色或更少,意味着单个红色或单个蓝色)和 IP 1.1.1.1 或 2.2.2.2 或两者都包括范围(正好 1.1.1.1和 2.2.2.2 或更少意味着单个 1.1.1.1 或单个 2.2.2.2 或者如果我们有多个 ip,它们需要完全匹配范围或更少)

意思是我想获得第 1,2,3 行

我开始写下一个查询,但我做错了:

    SELECT * FROM t where
    regexp_split_to_array(t.type, '@##@')::text[] in ('red','blue')
    and
    regexp_split_to_array(t.ip, '@##@')::inet[] in ('1.1.1.1','2.2.2.2')

提前致谢!

标签: sqlpostgresqlipsubnet

解决方案


您想要重叠运算符:

SELECT *
FROM t
WHERE regexp_split_to_array(t.type, '@##@')::text[] && array['red', 'blue'] and
      regexp_split_to_array(t.ip, '@##@')::inet[] && array['1.1.1.1', '2.2.2.2']

推荐阅读