У меня было похожее требование, чтобы использовать его при тестировании специализированного решения для репликации таблиц.
@ Решение Бена по MD5 (которое он добавил к вопросу) кажется довольно эффективным, но была пара ловушек, которые сбили меня с толку.
Первое (упомянутое в некоторых других ответах) заключается в том, что вам нужно убедиться, что агрегат выполняется в известном порядке по проверяемой вами таблице. Синтаксис для этого, например.
select zz_hashagg(CAST((example.*)AS text) order by id) from example;
Обратите внимание, что order by
находится внутри совокупности.
Во-вторых, использование CAST((example.*)AS text
не даст одинаковых результатов для двух таблиц с одинаковым содержимым столбцов, если столбцы не были созданы в одинаковом порядке. В моем случае это не гарантировалось, поэтому, чтобы получить истинное сравнение, мне пришлось перечислить столбцы отдельно, например:
select zz_hashagg(CAST((example.id, example.a, example.c)AS text) order by id) from example;
Для полноты (в случае, если последующее редактирование должно удалить его), вот определение zz_hashagg из вопроса @ Бена:
create function zz_concat(text, text) returns text as
'select md5($1 || $2);' language 'sql';
create aggregate zz_hashagg(text) (
sfunc = zz_concat,
stype = text,
initcond = '');