Sedan 8.4 finns det användbara inbyggda funktioner i Postgres som gör funktionen från det första svaret enklare och möjligen snabbare (det är vad EXPLAIN säger mig i alla fall:"(kostnad=0.00..0.07 rader=1 bredd=64)" för denna fråga vs. . "(kostnad=0.00..60.02 rader=1 bredd=64)" för den ursprungliga).
Den förenklade koden är:
SELECT ARRAY
(
SELECT UNNEST(a1)
INTERSECT
SELECT UNNEST(a2)
)
FROM (
SELECT array['two', 'four', 'six'] AS a1
, array['four', 'six', 'eight'] AS a2
) q;
och ja, du kan göra det till en funktion:
CREATE FUNCTION array_intersect(anyarray, anyarray)
RETURNS anyarray
language sql
as $FUNCTION$
SELECT ARRAY(
SELECT UNNEST($1)
INTERSECT
SELECT UNNEST($2)
);
$FUNCTION$;
som du kan ringa som
SELECT array_intersect(array['two', 'four', 'six']
, array['four', 'six', 'eight']);
Men du kan lika gärna kalla det inline också:
SELECT array(select unnest(array['two', 'four', 'six']) intersect
select unnest(array['four', 'six', 'eight']));