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 (Seção 52.20). 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