Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi enumerati
PrecedenteTipo booleanoTipi geometriciSuccessivo

8.7. Tipi enumerati

I tipi enumerati (enum) sono tipi di dati che fanno parte di un predefinito insieme, statico, di valori con uno specifico ordine. Essi sono equivalenti ai tipi enum contenuti in un certo numero di linguaggi di programmazione. Un esempio di tipo enum potrebbe essere i giorni della settimana, o un insieme di valori di stato per una certa parte di dati.

8.7.1. Dichiarazione di tipi enumerati

I tipi enum vengono creati usando il comando ???, per esempio:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

Una volta creato, il tipo enum può essere usato in definizioni di tabelle e funzioni come qualsiasi altro tipo:

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
    name text,
    current_mood mood
);
INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
 name | current_mood 
------+--------------
 Moe  | happy
(1 row)

8.7.2. Ordinamento

L'ordinamento dei valori in un tipo enum è l'ordine nel quale i valori sono stati elencati quando il tipo è stato dichiarato. Tutti gli operatori di confronto e le relative funzioni aggregate sono supportati per enum. Per esempio:

INSERT INTO person VALUES ('Larry', 'sad');
INSERT INTO person VALUES ('Curly', 'ok');
SELECT * FROM person WHERE current_mood > 'sad';
 name  | current_mood 
-------+--------------
 Moe   | happy
 Curly | ok
(2 rows)

SELECT * FROM person WHERE current_mood > 'sad' ORDER BY current_mood;
 name  | current_mood 
-------+--------------
 Curly | ok
 Moe   | happy
(2 rows)

SELECT name 
FROM person
WHERE current_mood = (SELECT MIN(current_mood) FROM person);
 name  
-------
 Larry
(1 row)

8.7.3. Sicurezza del tipo

I tipi enumerati sono tipi dati completamente separati e non possono essere confrontati con nessun altro.

CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
CREATE TABLE holidays (
    num_weeks integer,
    happiness happiness
);
INSERT INTO holidays(num_weeks,happiness) VALUES (4, 'happy');
INSERT INTO holidays(num_weeks,happiness) VALUES (6, 'very happy');
INSERT INTO holidays(num_weeks,happiness) VALUES (8, 'ecstatic');
INSERT INTO holidays(num_weeks,happiness) VALUES (2, 'sad');
ERROR:  invalid input value for enum happiness: "sad"
SELECT person.name, holidays.num_weeks FROM person, holidays
  WHERE person.current_mood = holidays.happiness;
ERROR:  operator does not exist: mood = happiness

Se si vuole realmente fare qualcosa di simile a questo, è possibile scrivere un operatore personalizzato o aggiungere una conversione esplicita alla propria query:

SELECT person.name, holidays.num_weeks FROM person, holidays
  WHERE person.current_mood::text = holidays.happiness::text;
 name | num_weeks 
------+-----------
 Moe  |         4
(1 row)

8.7.4. Dettagli di implementazione

Un valore enum occupa 4 byte su disco. La lunghezza del valore di una etichetta testuale di un enum è limitata dall'impostazione di NAMEDATALEN compilata in PostgreSQL™; nelle compilazioni standard sarà al massimo 63 byte.

Le etichette di enum sono sensibili alle maiuscole, per cui 'happy' non è uguale a 'HAPPY'. Inoltre, gli spazi nelle etichette sono significativi.

Le traduzioni da valori interni di enum a etichette testuali sono tenute nel catalogo di sistema pg_enum. Interroggare questo catalogo direttamente può essere utile.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipi enumerati
PrecedenteTipo booleanoTipi geometriciSuccessivo