La cosa più semplice da fare è ordinarli e confrontarli in ordine. Vedi sorting arrays in PostgreSQL.
Dato dati di esempio:
CREATE TABLE aa(ids integer[], signed_ids integer[]);
INSERT INTO aa(ids, signed_ids) VALUES (ARRAY[1,2,3], ARRAY[2,1,3]);
la cosa migliore da fare è se le voci di matrice sono sempre numeri interi è quello di utilizzare l'estensione intArray, come Erwin explains in his answer. È un lotto più veloce di qualsiasi formulazione pura SQL.
In caso contrario, per una versione generale che funziona per qualsiasi tipo di dati, definire un array_sort(anyarray)
:
CREATE OR REPLACE FUNCTION array_sort(anyarray) RETURNS anyarray AS $$
SELECT array_agg(x order by x) FROM unnest($1) x;
$$ LANGUAGE 'SQL';
e usarlo ordinare e confrontare le matrici ordinate:
SELECT array_sort(ids) = array_sort(signed_ids) FROM aa;
c'è un avvertimento importante:
SELECT array_sort(ARRAY[1,2,2,4,4]) = array_sort(ARRAY[1,2,4]);
sarà falso. Questo può o non può essere quello che vuoi, a seconda delle tue intenzioni.
alternativa, definire una funzione array_compare_as_set
:
CREATE OR REPLACE FUNCTION array_compare_as_set(anyarray,anyarray) RETURNS boolean AS $$
SELECT CASE
WHEN array_dims($1) <> array_dims($2) THEN
'f'
WHEN array_length($1,1) <> array_length($2,1) THEN
'f'
ELSE
NOT EXISTS (
SELECT 1
FROM unnest($1) a
FULL JOIN unnest($2) b ON (a=b)
WHERE a IS NULL or b IS NULL
)
END
$$ LANGUAGE 'SQL' IMMUTABLE;
e quindi:
SELECT array_compare_as_set(ids, signed_ids) FROM aa;
Questo è leggermente diverso da confrontare due valori array_sort
ed. array_compare_as_set
eliminerà i duplicati, rendendo array_compare_as_set(ARRAY[1,2,3,3],ARRAY[1,2,3])
vero, mentre array_sort(ARRAY[1,2,3,3]) = array_sort(ARRAY[1,2,3])
sarà falso.
Entrambi questi approcci avranno prestazioni piuttosto negative. Prendi in considerazione la possibilità di archiviare sempre gli array ordinati in primo luogo.
Quei array non sono uguali. Ho ragione ad indovinare che la tua vera domanda è "come faccio a confrontare due array PostgreSQL come se fossero insiemi, cioè senza rispettare l'ordine?" –
Sì, è esattamente quello che sto chiedendo :) – user766987
Domanda modificata per riflettere l'intenzione. –