Vous pouvez le faire en utilisant un index sur les expressions :
create unique index unq_test_a_b on (test(least(a, b), greatest(a, b));
Je ne pense pas que le unique
La contrainte autorise les expressions (et n'a pas de Postgres pratique à tester pour le moment), mais c'est essentiellement la même chose.