sql - 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')
提前致谢!
解决方案
您想要重叠运算符:
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']
推荐阅读
- android - Android Room 获取数据,其中交叉引用数据类具有第三方元素
- java - 文件夹在 Eclipse 中显示为包
- amazon-web-services - 在 AWS EC2 上运行 OpenVPN GUI 所需的配置
- python - 在 GroupBy 之后 Python Pandas DataFrame 困难变平
- azure - Azure Web 应用服务 CI/CD 中的文件名太长
- azure - 为多租户 Azure Active Directory 设置登录 - 所有租户的单一按钮
- sql - 为什么当记录数增加时我的查询变得太慢
- spring-boot - Spring MVC 控制器被忽略
- java - 从 .Net Web 应用程序调用的 Java taglib
- ios - 模仿手势驱动 UIPickerview