在postgresql中,如果两个数组具有公共成员,即它们重叠,则可以使用&&运算符返回t(true).是否有一个函数/运算符将返回那些常见成员?
即这样的事情
select arrray_intersection(ARRAY[1, 4, 2], ARRAY[2, 3]);
ARRAY[2]
Run Code Online (Sandbox Code Playgroud)
bar*_*art 55
从8.4开始,Postgres中有一些有用的内置函数,它们使第一个答案的函数更容易,也可能更快(这就是EXPLAIN告诉我的,无论如何:"(cost = 0.00..0.07 rows = 1 width = 64)"对于这个查询vs ."(成本= 0.00..60.02行= 1宽度= 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;
Run Code Online (Sandbox Code Playgroud)
是的,你可以把它变成一个功能:
CREATE FUNCTION array_intersect(anyarray, anyarray)
RETURNS anyarray
language sql
as $FUNCTION$
SELECT ARRAY(
SELECT UNNEST($1)
INTERSECT
SELECT UNNEST($2)
);
$FUNCTION$;
Run Code Online (Sandbox Code Playgroud)
你可以称之为
SELECT array_intersect(array['two', 'four', 'six']
, array['four', 'six', 'eight']);
Run Code Online (Sandbox Code Playgroud)
但你也可以把它称为内联:
SELECT array(select unnest(array['two', 'four', 'six']) intersect
select unnest(array['four', 'six', 'eight']));
Run Code Online (Sandbox Code Playgroud)
dwc*_*dwc 22
尝试&
而不是&&
有关更多信息,请参阅PostgreSQL文档.
如果您不介意安装扩展,则intarray 扩展提供了&
操作员来执行此操作,正如@dwc 指出的那样。:
SELECT ARRAY[1, 4, 2] & ARRAY[2, 3];
Run Code Online (Sandbox Code Playgroud)
返回{2}
。
一种方法
SELECT ARRAY( SELECT * FROM UNNEST( $1 ) WHERE UNNEST = ANY( $2 ) );
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26336 次 |
最近记录: |