Lo más simple es ordenarlos y compararlos ordenados. Ver sorting arrays in PostgreSQL.
Teniendo en cuenta los datos de la muestra:
CREATE TABLE aa(ids integer[], signed_ids integer[]);
INSERT INTO aa(ids, signed_ids) VALUES (ARRAY[1,2,3], ARRAY[2,1,3]);
lo mejor que puede hacer es si las entradas de la matriz son siempre números enteros es usar la extensión intArray, como Erwin explains in his answer. Es un lote más rápido que cualquier formulación de SQL puro.
De lo contrario, para una versión general de que funciona para cualquier tipo de datos, definir 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';
y usarlo ordenar y comparar las matrices Ordenada:
SELECT array_sort(ids) = array_sort(signed_ids) FROM aa;
Hay una advertencia importante:
SELECT array_sort(ARRAY[1,2,2,4,4]) = array_sort(ARRAY[1,2,4]);
serán falsos. Esto puede o no ser lo que quieras, dependiendo de tus intenciones.
Alternativamente, definir una función 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;
y luego:
SELECT array_compare_as_set(ids, signed_ids) FROM aa;
Esto es sutilmente diferente de la comparación de dos valores array_sort
ed. array_compare_as_set
eliminará duplicados, haciendo que array_compare_as_set(ARRAY[1,2,3,3],ARRAY[1,2,3])
sea verdadero, mientras que array_sort(ARRAY[1,2,3,3]) = array_sort(ARRAY[1,2,3])
será falso.
Ambos enfoques tendrán un rendimiento bastante malo. Considere asegurarse de que siempre almacena sus matrices ordenadas en primer lugar.
Esas matrices no son iguales. ¿Estoy en lo cierto al adivinar que su verdadera pregunta es "¿cómo puedo comparar dos matrices PostgreSQL como si fueran conjuntos, es decir, sin respetar el orden?" –
Sí, eso es exactamente lo que estoy pidiendo :) – user766987
Pregunta editada para reflejar la intención. –