Um den Thread zu schließen hier mein Lösungsvorschlag für einen einfachen Umgang mit composite-types …
und zwar erzeugt man sich einfach einen z.B.
create type point( x integer, y integer);
wie wir wissen kann man mit diesem erstmal so noch nicht viel anfangen … weil PG noch nicht weiss wie er den zu sortieren hat oder zu vergleichen oder zu indizieren.
mein wunsch war es ja, ohne grosse CREATE OPERATOR-orgien diesen typ point trotzdem nutzen zu koennen … mir ist nun eingefallen, dass man ja einer ::text eigenschaft - die, wie ich nun weiss eigentlich CAST heisst - auch bei anderen typen zum erfolg geführt wird, weil PG zumindest mit text oder anderen primitiven typen von haus aus umgehen kann …
ich habe mir also gedacht, dass PG mit einem
SELECT point FROM table WHERE point::text == ... ORDER BY point::text
was anfangen könnte … kann es auch - wie ich nun weiss.
diese idee habe ich im thread http://www.pg-forum.de/allgemeines/2462-text-hintergrundwissen.html#post12498
mal aufgegriffen um informationen zu derartigen ::xxxx casts zu erfahren …
für point wären dann noch zwei dinge notwendig. eine einfach function zur erzeugung der text-repräsentation
CREATE FUNCTION point_text(mySchema.point) RETURNS text
AS $$
SELECT $1.x || '. ' || $1.y
$$ LANGUAGE SQL;
und die erzeugung eines casts:
CREATE CAST (mySchema.point AS text)
man muss sich halt eine geeignete representation seines composite types einfallen lassen, mit der sich gut arbeiten laesst.
für den etwas komplizierteren fall - nach den komponenten x und y zu suchen order zu sortieren habe ich auch noch eine idee - die ich aber noch nicht geprueft habe - ob es funzt …
ich denke mir, dass man für x und y jeweils einen eigenen simplen user-defined type X und Y erzeugen sollte, die ihrerseits einfach als basistyp z.B. integer sind. Dann sollte man für point selbst noch zwei weitere casts ::X und ::Y erstellen koennen, die in der function point_X(point) AS text eben einfach x als typ X liefern (analog für Y in einer weiteren function und cast)
Wenn man also eine Tabelle hat in der ein Feld fpoint vom typ point existiert, dann sollte man dann in der lage sein z.B.
SELECT ... FROM .. WHERE fpoint::Y > .. ORDER BY fpoint::X
-Abfragen abzusetzen
Wenn irgendwer noch irgendwelche Ideen zum Thema hat - immer her damit.
Gruß