PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A diferença na ordenação de literais do tipo enum entre PostgreSQL 9.0 e 9.1


Acho que você precisará verificar a versão do PostgreSQL e alterar o comportamento adequadamente, ou usar SQL que não toque no catálogo para determinar a ordenação.

Uma ideia para o último, dado o enum fictício:
CREATE TYPE test_enum AS ENUM ('z','x','y');
ALTER TYPE test_enum ADD VALUE 'a' BEFORE 'x';

é ORDER BY a conversão do rótulo enum para valores do tipo enum usando o row_number função de janela disponível na versão 8.4 e mais recente:
SELECT enumlabel, row_number() OVER (ORDER BY enumlabel::test_enum) AS sort_key
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype;

Isso obtém os rótulos ordenados por uma chave de classificação. Nas versões mais antigas do Pg, o Pg apenas classificará pelo oid dos valores enum, em versões mais recentes ele usará o enumsortorder, mas você não precisa se importar de qualquer maneira, você acabou de dizer ao PostgreSQL "ordene-os na ordem correta, por favor".

Ou se você só precisa deles na ordem que o servidor espera, escreva:
SELECT enumlabel
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype
ORDER BY enumlabel::test_enum