Sql 选择在一列中共享公共值的行

Sql 选择在一列中共享公共值的行,sql,postgresql,Sql,Postgresql,我的表格如下: 从中我可以看出,一些供应商使用相同的ip地址,可以用不同的方式写入。我如何编写一个sql查询,让我能够找到那些使用相同ip地址的供应商 84.20.93.11- 84.20.93.11, 84.20.93.11 84.20.93.11- 84.20.93.11 84.20.93.11 地址是一样的吗 UPD: 因此,我想 您可以将该列表转换为数组,并使用该数组查找具有相同IP地址的其他行 大致如下: select * from the_table t1 where exists

我的表格如下:

从中我可以看出,一些供应商使用相同的ip地址,可以用不同的方式写入。我如何编写一个sql查询,让我能够找到那些使用相同ip地址的供应商

84.20.93.11- 84.20.93.11, 84.20.93.11 84.20.93.11- 84.20.93.11 84.20.93.11 地址是一样的吗

UPD: 因此,我想


您可以将该列表转换为数组,并使用该数组查找具有相同IP地址的其他行

大致如下:

select *
from the_table t1
where exists (select *
              from the_table t2
              where regexp_split_to_array(t1.ip, '\s*[^0-9.]\s*')
                    && regexp_split_to_array(t2.ip, '\s*[^0-9.]\s*')
                and t1.supplier_id <> t2.supplier_id)
表达式regexp_split_to_arrayt1.ip,'\s*[^0-9.]\s*'将ip地址列表转换为数组,并拆分任何非ip地址的内容。因此,regexp_split_to_数组'84.20.93.11-84.20.93.11,84.20.93.11','\s*[^0-9-,]\s*'返回以下数组{84.20.93.11,84.20.93.11,84.20.93.11}


&&然后检查两个供应商的阵列是否重叠,即它们是否至少有一个共同的IP地址

根据您发布的数据,并根据您问题中所述的要求和期望的结果,自行加入即可

我在你的问题中找不到表名,所以我使用供应商作为表名

选择不同的s1.supplier\u id 来自供应商s1 加入供应商s2 在s1.ip=s2.ip上 和s1.ctid s2.ctid
注意,ctid是PostgreSQL生成的表中的行的唯一ID。该条件确保查询不会将表S1中的同一行与表S2中的同一行进行比较。

修复数据模型!不要将ip地址范围存储为字符串-在SQL中解析这些信息非常痛苦。请用您正在使用的数据库标记您的问题:mysql、oracle、,postgresql…?是时候考虑一下@kulan,然后责怪设计它的人了this@kulan:或者更好:让负责此类设计的人员编写查询;你能看看我的最新消息吗?我只想获得不同的供应商id使用选择不同的供应商id。。。