最简单的做法是对它们进行排序并比较它们的排序。见sorting arrays in PostgreSQL。
给定样本数据:
CREATE TABLE aa(ids integer[], signed_ids integer[]);
INSERT INTO aa(ids, signed_ids) VALUES (ARRAY[1,2,3], ARRAY[2,1,3]);
如果数组条目总是整数,最好的办法是使用 intarray 扩展,如Erwin explains in his answer。它比任何纯 SQL 公式都快很多。
否则,对于适用于任何数据类型的通用版本,请定义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';
并使用它对排序后的数组进行排序和比较:
SELECT array_sort(ids) = array_sort(signed_ids) FROM aa;
有一个重要的警告:
SELECT array_sort( ARRAY[1,2,2,4,4] ) = array_sort( ARRAY[1,2,4] );
将是错误的。这可能是也可能不是您想要的,取决于您的意图。
或者,定义一个函数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;
然后:
SELECT array_compare_as_set(ids, signed_ids) FROM aa;
这与比较两个array_sorted 值略有不同。 array_compare_as_set 将消除重复,使array_compare_as_set(ARRAY[1,2,3,3],ARRAY[1,2,3]) 为真,而array_sort(ARRAY[1,2,3,3]) = array_sort(ARRAY[1,2,3]) 为假。
这两种方法的性能都很差。考虑确保您始终首先存储已排序的数组。