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

Reply via email to