PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Der Unterschied in der Reihenfolge von Aufzählungstypliteralen zwischen PostgreSQL 9.0 und 9.1

Ich denke, Sie müssen die PostgreSQL-Version überprüfen und das Verhalten entsprechend ändern oder SQL verwenden, das den Katalog nicht berührt, um die Reihenfolge zu bestimmen.

Eine Idee für letzteres, gegebenes Dummy-Enum:

CREATE TYPE test_enum AS ENUM ('z','x','y');
ALTER TYPE test_enum ADD VALUE 'a' BEFORE 'x';

ist ORDER BY die Umwandlung des Enum-Labels in Werte des Enum-Typs unter Verwendung von row_number Fensterfunktion verfügbar in 8.4 und neuer:

SELECT enumlabel, row_number() OVER (ORDER BY enumlabel::test_enum) AS sort_key
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype;

Dadurch erhalten Sie die Etiketten, die nach einem Sortierschlüssel geordnet sind. In älteren Pg-Versionen sortiert Pg nur nach dem oid der Enum-Werte, in neueren Versionen wird es die enumsortorder verwenden, aber Sie müssen sich so oder so nicht darum kümmern, Sie haben PostgreSQL gerade gesagt:"Sortieren Sie diese bitte in der richtigen Reihenfolge".

Oder wenn Sie sie nur in der vom Server erwarteten Reihenfolge benötigen, schreiben Sie:

SELECT enumlabel
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype
ORDER BY enumlabel::test_enum