Erstellen eines benutzerdefinierten "Gleichheitsoperators" für den PostgreSQL-Typ (Punkt) für DISTINCT-Aufrufe
In einer meiner Tabellen habe ich eine Spalte, die als PostgreSQL-Typ definiert istpoint
. Ich benutze dies für dasearthdistance
-Modul - speziell das<@>
Fernoperator. (Ja, ich kenne PostGIS, aber es war weitaus komplexer als meine Anforderungen, da es einfach eine Tabelle mit Lat / Long-Paaren gibt. Ordnen Sie die Tabelle nach Entfernung mit Fehlerfreiheit von einer angegebenen Lat / Long-Tabelle.)
Jedoch,point
scheint keine Gleichheit implementiert zu haben, daher kannDISTINCT
auf dem Tisch anrufen wieSELECT DISTINCT * FROM mytable
führt zu folgendem Fehler:
ERROR: could not identify an equality operator for type point
Obwohl es im Allgemeinen nicht ratsam ist, eingebaute Typen zu patchen, macht es mir in diesem Fall nichts aus, und ich habe versucht, meine eigenen @ zu erstelle=
Operator fürpoint
:
CREATE OR REPLACE FUNCTION compare_points_equality(point1 POINT, point2 POINT)
RETURNS BOOLEAN AS $
SELECT point1[0] = point2[0] AND point1[1] = point1[1];
$ LANGUAGE SQL IMMUTABLE;
CREATE OPERATOR = (
LEFTARG = POINT,
RIGHTARG = POINT,
PROCEDURE = compare_points_equality,
COMMUTATOR = =,
NEGATOR = !=,
HASHES,
MERGES
);
Aber auch nachdem ich das erstellt habe, bekomme ich den gleichen Fehler. Was soll ich tun, um den "Gleichheitsoperator" zu erstellen, wenn nicht create=
?