匹配两个数组列 postgresql-9.4-

Posted

技术标签:

【中文标题】匹配两个数组列 postgresql-9.4-【英文标题】:matching two array columns postgresql-9.4- 【发布时间】:2016-02-18 07:19:31 【问题描述】:

在同一行;

Array column 1 has 2,4,5 value  
Array column 2 has 4,8,9 value  

我想要做的是查询表中与两个数组列中至少一个数字匹配的行,这些列与上面的示例匹配;数字 4 提供了这种匹配。

我如何查询,当然对于表中每一行中的每 2 个数组列?我想选择匹配 2 个数组列的行。

【问题讨论】:

【参考方案1】:

如果您安装了intarray 扩展,这变得很容易,您可以使用& 运算符来获取两个数组之间的交集:

with data (col1, col2) as (
  values 
    (array[3,4,5], array[4,8,9]), 
    (array[1,2,3,4], array[6,5,1]),
    (array[1,2,3,4], array[7,8,9,10]) 
)
select col1 & col2
from data 
where cardinality(col1 & col2) > 0;

返回:

common_elements
---------------
4            
1            

编辑

要在没有扩展名或 bigint 数组的情况下执行此操作,您可以将两列取消嵌套到集合中,然后对这些集合进行交集。这需要表上有一个主键(或唯一)列(您没有提到)

with data (id, col1, col2) as (
  values 
    (1, array[3,4,5]::bigint[], array[4,8,9]::bigint[]), 
    (2, array[1,2,3,4]::bigint[], array[6,5,1]::bigint[]),
    (3, array[1,2,3,4]::bigint[], array[7,8,9,10]::bigint[]) 
)
select id, array_agg(element) as elements
from (
  select id, unnest(col1) as element
  from data 
  intersect
  select id, unnest(col2)
  from data
) t
group by id;

返回:

id | elements
---+---------
 1 | 4
 2 | 1

【讨论】:

谢谢:)...我想知道没有这个扩展我怎么能做到这一点? @lowdegeneration:为什么?它使它变得简单而高效。扩展是标准 Postgres 安装的一部分。您只需create extension intarray; 它不适用于 bigint[] 对吧?因为在数组中使用 bigint 类型时出现错误。 @lowdegeneration:看起来像。请参阅我的编辑以获取不同的解决方案

以上是关于匹配两个数组列 postgresql-9.4-的主要内容,如果未能解决你的问题,请参考以下文章

在WPS电子表格中获取匹配列的值

Postgres将所有数组值与和条件匹配到同一列

AWK 比较两个文件中的两列输出匹配行 - 匹配中缺少行

查找两个不同数据框列之间的部分匹配,并在找到匹配时分配值

验证两个不同表的两列完全匹配

SQl 在整数和 json 数组上加入表格以获取整数