PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La differenza nell'ordine dei letterali di tipo enum tra PostgreSQL 9.0 e 9.1

Penso che dovrai controllare la versione di PostgreSQL e modificare il comportamento in modo appropriato, oppure utilizzare SQL che non tocchi il catalogo per determinare l'ordine.

Un'idea per quest'ultimo, data enum fittizia:

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

è ORDER BY il cast dell'etichetta enum ai valori del tipo enum utilizzando il row_number funzione finestra disponibile in 8.4 e versioni successive:

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

Questo ti dà le etichette ordinate da una chiave di ordinamento. Nelle versioni precedenti di Pg, Pg verrà semplicemente ordinato in base a oid dei valori enum, nelle versioni più recenti utilizzerà enumsortorder, ma non devi preoccuparti in alcun modo, hai appena detto a PostgreSQL "ordinali nell'ordine corretto, per favore".

Oppure, se ti servono solo nell'ordine previsto dal server, scrivi:

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