Folgendes verwende ich derzeit:
CREATE FUNCTION array_intersect(a1 anyarray, a2 anyarray)
RETURNS anyarray AS
$$
SELECT ARRAY(
SELECT unnest($1)
INTERSECT SELECT unnest($2)
ORDER BY 1
);
$$ LANGUAGE sql
IMMUTABLE STRICT;
--get the length:
select array_length ( array_intersect(array[...], array[...]), 1);
Gibt es einen schnelleren Weg?
postgresql
performance
postgresql-9.3
array
Neil McGuigan
quelle
quelle
intarray
Erweiterung den&
Operator bereit , aber es scheint trotz des&&
Booleschen Tests für überlappende Arrays nicht für alle Arrays einen verallgemeinerten zu geben . Es wäre schön hinzuzufügen, aber ... nun, werfen Sie einen Blick auf den C-Quellcode für die PostgreSQL-Allzweck-Array-Funktionen und -Operatoren, um zu sehen, warum es nicht so viele gibt, wie Sie vielleicht erwarten. Die Array-API ist schrecklich.Antworten:
Sie sagen, Sie suchen nach "Jaccard-Ähnlichkeit zwischen zwei Arrays"
Sie können MadLib in Betracht ziehen, das dies als bereitstellt
dist_jaccard()
Vielleicht möchten Sie es auch ohne versuchen
STRICT
. Das könnte es verlangsamen.Möglicherweise möchten Sie verwenden,
INTERSECT ALL
insbesondere wenn Sie wissen, dass Sie keine Dupes haben$1
.Wie Craig Ringer in den Kommentaren sagte, möchten Sie vielleicht heraus
intarray
und verwenden&
.Um hier eine genauere Antwort zu geben,
INTERSECT
?quelle