Bruce Momjian wrote: > Is there a way to do a SELECT DISTINCT on boxes: > > test=> create TABLE t3 (a box); > CREATE TABLE > test=> insert into t3 values ('(2,2),(1,1)'); > INSERT 17232 1 > test=> insert into t3 values ('(2,2),(1,1)'); > INSERT 17233 1 > test=> insert into t3 values ('(3,3),(2,2)'); > INSERT 17234 1 > test=> insert into t3 values ('(3,3),(2,2)'); > INSERT 17235 1 > test=> select distinct * from t3; > ERROR: could not identify an ordering operator for type box > HINT: Use an explicit ordering operator or modify the query. > > I tried doing subqueries and using oids but that didn't help. > > I don't understand why this doesn't work: > > SELECT a > FROM t3 t2 > WHERE t2.oid = (SELECT MIN(t.oid) FROM t3 t WHERE t2.a = t.a); > > a > ------------- > (2,2),(1,1) > (1 row) > > If finds only the duplicate.
I found the cause. Equals for boxes compares only area, \do: pg_catalog | = | box | box | boolean | equal by area The proper fix is to use ~= which compares boxes for similarity: pg_catalog | ~= | box | box | boolean | same as? The correct query for DISTINCT is: test=> SELECT oid, a FROM t3 t2 WHERE t2.oid = (SELECT MIN(t.oid) FROM t3 t WHERE t2.a ~= t.a); oid | a -------+------------- 17232 | (2,2),(1,1) 17234 | (3,3),(2,2) (2 rows) -- Bruce Momjian | http://candle.pha.pa.us [EMAIL PROTECTED] | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster