PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

La différence dans l'ordre des littéraux de type enum entre PostgreSQL 9.0 et 9.1

Je pense que vous devrez vérifier la version de PostgreSQL et modifier le comportement de manière appropriée, ou utiliser SQL qui ne touche pas au catalogue pour déterminer l'ordre.

Une idée pour ce dernier, étant donné l'énumération factice :

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

est de ORDER BY la conversion de l'étiquette enum en valeurs de type enum en utilisant le row_number fonction de fenêtre disponible dans 8.4 et versions ultérieures :

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

Cela vous permet d'obtenir les étiquettes classées par une clé de tri. Dans les anciennes versions de Pg, Pg triera simplement par oid des valeurs enum, dans les versions plus récentes, il utilisera l'enumsortorder, mais vous n'avez pas à vous en soucier de toute façon, vous venez de dire à PostgreSQL "triez-les dans le bon ordre s'il vous plaît".

Ou si vous en avez juste besoin dans l'ordre attendu par le serveur, écrivez :

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