CREATE CAST

名前

CREATE CAST -- 新しいキャストの定義

概要

CREATE CAST (sourcetype AS targettype)
    WITH FUNCTION funcname (argtype)
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (sourcetype AS targettype)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

説明

CREATE CAST を使用すると、新しいキャストを定義できます。 キャストにより、2 つのデータ型間の変換処理方法を指定します。 以下に例を示します。

SELECT CAST(42 AS text);

この処理を実行すると、事前に指定された関数、この場合 text(int4)を呼び出し、整数の定数である 42 を text データ型に変換します。 (適切なキャストが定義されていない場合、変換処理は失敗します。)

2 つのデータ型は、バイナリ互換性がある 場合があります。 つまり、"自由に"関数を呼び出すことなくお互いのデータ型に変換することができます。 この場合、対応する値は、同じ内部表現を使用している必要があります。 たとえば、データ型 text および varchar は、バイナリ互換性があります。

デフォルトでは、キャストは明示的なキャスト要求があった場合のみ呼び出し可能です。 明示的なキャストの構文とは、CAST(x AS typename)x::typename、もしくは typename(x) です。

キャストに AS ASSIGNMENT オプションを付けると、対象データ型の列に代入する際、暗黙的にそのキャストを呼び出すように設定できます。 たとえば、foo.f1text 型のカラムであるとします。

INSERT INTO foo (f1) VALUES (42);

integer 型から text 型へ変換するキャストに AS ASSIGNMENT オプションが付けられていれば、上記の SQL 文は実行可能です。 オプションが付いていなければ、実行できません。 (一般的に、この種のキャストは代入キャストと呼ばれています。 )

キャストに AS IMPLICIT オプションを付けると、代入でも、もしくは式の中にあるものでも、すべてのコンテキストで暗黙的にそのキャストを呼び出すように設定できます。 以下の例を参照してください。 ||text 型の引数を受け取りますので、

SELECT 'The time is ' || now();

という SQL 文は、timestamp 型から text 型へ変換するキャストに AS IMPLICIT オプションが付けられている場合のみ実行可能です。 オプションが付いていなければ、以下のように明示的にキャストを記述する必要があります。

SELECT 'The time is ' || CAST(now() AS text);

(一般的に、この種のキャストは暗黙キャストと呼ばれています。 )

暗黙キャストは、多用しない方が賢明です。 暗黙的キャストを使用しすぎると、PostgreSQL がコマンドを思わぬ意味に解釈してしまう原因になります。もしくは、複数の解釈が可能なため、コマンドをまったく解読できなくなってしまう可能性もあります。 経験的には、同じ一般的なデータ型カテゴリのデータ型間で、情報を保持する変換でのみ、暗黙キャストを呼び出し可能にするのが良い方法と思われます。 たとえば、int2 型から int4 型へのキャストは、暗黙キャストにするのが妥当ですが、float8 型から int4 型へのキャストは、おそらく代入キャストのみとすべきでしょう。 text 型から int4 型への変換のような、カテゴリを越えるデータ型のキャストは、明示的にのみ使用するのが適切です。

キャストを作成可能にするには、変換元または変換先のデータ型を所有している必要があります。 また、バイナリ互換性があるキャストを作成するには、スーパーユーザである必要があります (バイナリ互換性があるキャスト変換を誤って使用するとサーバがクラッシュしてしまう可能性が高いことから、この制限が付けられました)。

パラメータ

sourcetype

キャストする変換元のデータ型の名前です。

targettype

キャストする変換先のデータ型の名前です。

funcname(argtype)

この関数は、キャストを実行するために使用します。 関数名は、スキーマ修飾することができます。 スキーマ修飾されていない場合、関数はパスから検索されます。 引数のデータ型はキャストの変換元のデータ型と、結果のデータ型はキャストの変換先のデータ型と一致する必要があります。

WITHOUT FUNCTION

変換元データ型および変換先データ型は、バイナリ互換性があることを示します。 したがって、キャストを実行するのに関数は必要ありません。

AS ASSIGNMENT

代入コンテキストで、暗黙的にキャストを呼び出せることを示します。

AS IMPLICIT

任意のコンテキストで、暗黙的にキャストを呼び出せることを示します。

注釈

ユーザ定義のキャストを削除するには、DROP CAST を使用してください。

データ型を双方向に変更可能にするには、双方向のキャストを明示的に宣言する必要があることに注意してください。

PostgreSQL 7.3 より前のバージョンでは、データ型と同じ名前の関数はすべてそのデータ型を返しました。また、異なるデータ型の引数を 1 つ取っていると、これが自動的にキャスト関数とされていました。 この慣習は、スキーマを導入し、システムカタログでバイナリ互換性があるキャストを表現可能になったことにより、禁止されました。 (組み込みキャスト関数は、まだこの命名規則に従っています。しかし、現在は pg_cast でキャストとして示される必要があります。 )

関数 int4(text) を使用した text 型から int4 型へのキャストを作成します。

CREATE CAST (text AS int4) WITH FUNCTION int4(text);

(このキャストは、システムにすでに事前定義されています。)

互換性

CREATE CAST は、SQL99 ではバイナリ互換性があるデータ型についての規定を行わない点を除き、SQL99 に準拠しています。 AS IMPLICIT も、PostgreSQL の拡張です。

関連項目

CREATE FUNCTION, CREATE TYPE, DROP CAST