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.
enum #
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