sql - Postgres - 返回 2 个 ARRAY 的交集的函数?

标签 sql postgresql

在 postgresql 中,如果两个数组具有共同成员,即它们重叠,则可以使用 && 运算符返回 t (true)。是否有一个函数/运算符会返回那些公共(public)成员的内容?

即像这样

select arrray_intersection(ARRAY[1, 4, 2], ARRAY[2, 3]);
ARRAY[2]

最佳答案

Since 8.4, there are useful builtins in Postgres这使得the function from the first answer更容易,可能更快(无论如何,这就是 EXPLAIN 告诉我的:“(cost=0.00..0.07 rows=1 width=64)”对于此查询与“(cost=0.00..60.02 rows=1 width=64)”对于原始的)。

简化的代码是:

SELECT ARRAY
    (
        SELECT UNNEST(a1)
        INTERSECT
        SELECT UNNEST(a2)
    )
FROM  (
        SELECT  array['two', 'four', 'six'] AS a1
              , array['four', 'six', 'eight'] AS a2
      ) q;

是的,你可以把它变成一个函数:

CREATE FUNCTION array_intersect(anyarray, anyarray)
  RETURNS anyarray
  language sql
as $FUNCTION$
    SELECT ARRAY(
        SELECT UNNEST($1)
        INTERSECT
        SELECT UNNEST($2)
    );
$FUNCTION$;

你可以称之为

SELECT array_intersect(array['two', 'four', 'six']
                     , array['four', 'six', 'eight']);

但您也可以将其称为内联:

 SELECT array(select unnest(array['two', 'four', 'six']) intersect
              select unnest(array['four', 'six', 'eight']));

关于sql - Postgres - 返回 2 个 ARRAY 的交集的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756871/

相关文章:

php - 如何在 PHP 中使用 SQLSTATE '45000' MESSAGE_TEXT?

SQL Server 合并来自同一 Azure SQL SERVER 的不同 Azure SQL 数据库的两个表

postgresql - Postgres 时间戳索引性能

python-3.x - Geoalchemy2 在给定坐标内查找一定距离内的位置

python - Django ORM - 不同表中行的部分匹配

MySQL内连接查询多表

mysql - 采购数据表中,如何使用SQL查询每日业绩

用于包含 ID 列上所有内容的 SQL 参数

postgresql - 可空的自然 id?

database - 使用 pgAdmin 导出 Postgresql 表数据