Os tipos de dados enum (enumeração) são tipos de dados que compreendem um conjunto estático e ordenado de valores. São equivalentes aos tipos de dados enum encontrados em muitas linguagens de programação [47]. Exemplos de tipo de dados enum podem ser os dias da semana, os meses do ano, ou um conjunto de valores de estado para um dado.
Os tipos de dados enum são criados usando o comando CREATE TYPE, como:
CREATE TYPE ânimo AS ENUM ('triste', 'normal', 'feliz');
Uma vez criado, o tipo de dados enum pode ser usado em definições de tabela e função como qualquer outro tipo de dados:
CREATE TABLE pessoas (
nome text,
ânimo_atual ânimo
);
INSERT INTO pessoas VALUES ('Moe', 'feliz');
SELECT * FROM pessoas WHERE ânimo_atual = 'feliz';
nome | ânimo_atual
------+-------------
Moe | feliz
(1 linha)
A ordem de classificação dos valores do tipo de dados enum é a ordem na qual os valores foram listados quando o tipo de dados foi criado. Todos os operadores de comparação e funções de agregação relacionadas são compatíveis com o tipo de dados enum. Por exemplo:
INSERT INTO pessoas VALUES ('Larry', 'triste');
INSERT INTO pessoas VALUES ('Curly', 'normal');
SELECT *
FROM pessoas
WHERE ânimo_atual > 'triste';
nome | ânimo_atual
-------+-------------
Moe | feliz
Curly | normal
(2 linhas)
SELECT *
FROM pessoas
WHERE ânimo_atual > 'triste'
ORDER BY ânimo_atual;
nome | ânimo_atual
-------+-------------
Curly | normal
Moe | feliz
(2 linhas)
SELECT nome
FROM pessoas
WHERE ânimo_atual = (SELECT MIN(ânimo_atual) FROM pessoas);
nome
-------
Larry
(1 linha)
Cada tipo de dados enum é separado, não podendo ser comparado com outros tipos de dados enum. Veja o seguinte exemplo:
CREATE TYPE felicidade AS ENUM ('feliz', 'muito feliz', 'em êxtase');
CREATE TABLE férias (
num_semanas integer,
felicidade felicidade
);
INSERT INTO férias(num_semanas,felicidade) VALUES (4, 'feliz');
INSERT INTO férias(num_semanas,felicidade) VALUES (6, 'muito feliz');
INSERT INTO férias(num_semanas,felicidade) VALUES (8, 'em êxtase');
INSERT INTO férias(num_semanas,felicidade) VALUES (2, 'desanimado');
ERRO: valor de entrada inválido para enum felicidade: "desanimado"
SELECT pessoas.nome, férias.num_semanas FROM pessoas, férias
WHERE pessoas.ânimo_atual = férias.felicidade;
ERRO: operador não existe: "ânimo" = felicidade
Se realmente for necessário fazer algo assim, pode ser escrito um operador personalizado ou adicionadas conversões explícitas à consulta:
SELECT pessoas.nome, férias.num_semanas FROM pessoas, férias WHERE pessoas.ânimo_atual::text = férias.felicidade::text; nome | num_semanas ------+------------- Moe | 4 (1 linha)
Os rótulos da enumeração diferenciam letras maiúsculas de minúsculas,
portanto 'feliz' não é idêntico a 'FELIZ'.
Os espaços em branco também têm significado.
Embora os tipos de dados enum se destinem, principalmente, a conjuntos de valores estáticos, há suporte para adicionar novos valores a um tipo de dados enum existente, e para mudar o nome dos valores (veja ALTER TYPE). Os valores existentes em um tipo de dados enum não podem ser removidos, nem a ordem de classificação destes valores pode ser alterada, a não ser excluindo e recriando o tipo de dados enum.
O valor enum ocupa
quatro bytes no disco.
O comprimento do rótulo textual de um valor
enum está limitado pela
definição de NAMEDATALEN compilada no
PostgreSQL;
nas construções padrão isto significa um máximo de 63 bytes.
As traduções dos valores internos de enumeração para rótulos textuais são mantidas no catálogo do sistema (pg_enum). Consultar este catálogo diretamente pode ser útil.
Exemplo 8.12. Exemplo do tradutor
Consulta aos catálogos do sistema pg_enum
e pg_type.
SELECT t.typname, e.enumsortorder, e.enumlabel FROM pg_enum e, pg_type t WHERE e.enumtypid = t.oid ORDER BY t.typname, e.enumsortorder;
typname | enumsortorder | enumlabel ------------+---------------+------------- felicidade | 1 | feliz felicidade | 2 | muito feliz felicidade | 3 | em êxtase ânimo | 1 | triste ânimo | 2 | normal ânimo | 3 | feliz (6 linhas)
[47] Na linguagem C, enumeração (ou enum) é um tipo de dados definido pelo usuário que contém um conjunto com nome próprio de constantes inteiras. É usado para atribuir nomes significativos a valores inteiros, tornando o programa fácil de ler e manter. Fonte: Enumeration (or enum) in C