バージョンごとのドキュメント一覧

8.7. 列挙型 #

<title>Enumerated Types</title>

Enumerated (enum) types are data types that comprise a static, ordered set of values. They are equivalent to the <type>enum</type> types supported in a number of programming languages. An example of an enum type might be the days of the week, or a set of status values for a piece of data. 列挙(enum)型は静的、順序付き集合から構成されるデータ型です。 これは、多くのプログラミング言語でサポートされているenum型と同じです。 列挙型の例として、曜日や個々のデータについての状態値の集合が挙げられます。

8.7.1. 列挙型の宣言 #

<title>Declaration of Enumerated Types</title>

Enum types are created using the <xref linkend="sql-createtype"/> command, for example: 列挙型はCREATE TYPEコマンドを使用して作成されます。 以下に例を示します。

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

Once created, the enum type can be used in table and function definitions much like any other type: 作成後、他のデータ型とほとんど同じように、列挙型をテーブルや関数定義で使用することができます。

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. 順序 #

<title>Ordering</title>

The ordering of the values in an enum type is the order in which the values were listed when the type was created. All standard comparison operators and related aggregate functions are supported for enums. For example: 列挙型内の値の順序はその型が作成された時に値を列挙した順番になります。 列挙型に対して、すべての比較演算子と関連する集約関数がサポートされます。 以下に例を示します。

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. 型の安全性 #

<title>Type Safety</title>

Each enumerated data type is separate and cannot be compared with other enumerated types. See this example: それぞれの列挙型データ型は別個のもので、他の列挙型と比較することはできません。 以下の例を参照してください。

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

If you really need to do something like that, you can either write a custom operator or add explicit casts to your 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. 実装の詳細 #

<title>Implementation Details</title>

Enum labels are case sensitive, so <type>'happy'</type> is not the same as <type>'HAPPY'</type>. White space in the labels is significant too. 列挙型のラベルは大文字小文字の違いを意識します。 このため、'happy''HAPPY'は同じではありません。 同様にラベルの中の空白も重要です。

Although enum types are primarily intended for static sets of values, there is support for adding new values to an existing enum type, and for renaming values (see <xref linkend="sql-altertype"/>). Existing values cannot be removed from an enum type, nor can the sort ordering of such values be changed, short of dropping and re-creating the enum type. 列挙型は主に静的な値のセットを対象としていますが、既存の列挙型に新しい値を加えることや名前を変更することをサポートしています(ALTER TYPEを参照)。 ただし、列挙型を削除して再作成せずに、既存の列挙型からラベルを削除することやソート順が変わる値に変更することはできません。

An enum value occupies four bytes on disk. The length of an enum value's textual label is limited by the <symbol>NAMEDATALEN</symbol> setting compiled into <productname>PostgreSQL</productname>; in standard builds this means at most 63 bytes. 列挙型の値はディスク上では4バイトを占めます。 列挙型の値のテキストラベルの長さは、PostgreSQLに組み込まれたNAMEDATALEN設定により制限されます。 標準のビルドでは、これは最大63バイトを意味します。

The translations from internal enum values to textual labels are kept in the system catalog <link linkend="catalog-pg-enum"><structname>pg_enum</structname></link>. Querying this catalog directly can be useful. 列挙型の内部値からテキスト形式のラベルへの変換は、pg_enumシステムカタログ内に保持されます。 このカタログを直接問い合わせることが役に立つ場合があります。