★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

CREATE CAST

名前

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

概要

CREATE CAST (sourcetype AS targettype)
    WITH FUNCTION funcname (argtypes)
    [ 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です。

キャストに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(argtypes)

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

WITHOUT FUNCTION

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

AS ASSIGNMENT

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

AS IMPLICIT

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

キャストを実装する関数は1から3つの引数を取ることができます。 1番目の引数型はキャストの変換元データ型と同一でなければなりません。 2番目の引数は、もしあれば、integer型でなければならず、変換先の型に関連付いた型修飾子を受け取ります。 型修飾子がない場合は-1を受け取ります。 3番目の引数は、もしあれば、boolean型でなければならず、キャストが明示的なキャストであればtrueを、それ以外であればfalseを受け取ります。 (奇妙ですが、SQL仕様では、明示的キャストと暗黙的キャストとの間で異なる振舞いを要求する場合があります。 この引数はそうした状況を実装しなければならない関数用に提供されるものです。 独自のデータ型をこの流儀に従うように設計することは勧められません。)

普通、キャストは異なる変換元と変換先のデータ型を持たなければなりません。 しかし、2つ以上の引数をもつ関数でキャストを実装した場合は、変換元と変換先とで同一のデータ型を持つキャストを宣言することができます。 これは、システムカタログにおいて型固有の長さ強制関数を表現するために使用されてます。 指名された関数は、2番目の引数で与えられた型修飾子の値で型の値を強制するために使用されます。 (文法上、特定の組み込みデータ型のみが型修飾子を持つことができますので、この機能は変換先がユーザ定義のデータ型の場合には役に立ちません。 説明を完全にするためにここで記述しています。)

変換元と変換先のデータ型が異なるキャストで、その関数が複数の引数を取る場合、それは、あるデータ型から他のデータ型への変換と長さの強制を1つの操作にまとめたものであることを表します。 こうした項目がないと、型修飾子を使用する型の強制は、最初にデータ型間の変換、次に修飾子の適用という2つの操作が必要となります。

注釈

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

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

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

必要ではありませんが、キャストを実装する関数を変換先のデータ型に因んで命名するという、この古い慣習に従い続けることを推奨します。 多くのユーザは関数様式の記法、つまりtypename(x)、を使用してデータ型のキャストができるということを使用しています。 この記法はキャストを実装する関数を呼び出していることに他なりません。 特にキャストとして扱っているわけではないのです。 独自の変換関数の名前がこの慣習に従っていないと、他のユーザはとまどうことになります。 PostgreSQLは異なる引数型で同じ名前の関数をオーバーロードすることができますので、様々な型からある変換先型への複数の変換関数を、全て変換先の型名を使用して作成することは難しくありません。

注意: 上の段落には小さな嘘があります。 明確な関数呼び出しの意味解決のためにpg_castが使用される場合があることです。 関数呼び出しname(x)が実際の関数に一致せず、nameがデータ型の名前であり、pg_castxの型からその型へのキャストがバイナリ互換であることを示していた場合、この呼び出しは明示的キャストとして呼び出されます。 この例外は、バイナリ互換キャストを、実際の関数がなかったとしても、関数のような構文で呼び出すことができるように作成されました。

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

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

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

互換性

CREATE CASTは、SQL:1999ではバイナリ互換性があるデータ型や実装する関数への多くの引数についての規定を行わない点を除き、SQL:1999に準拠しています。 AS IMPLICITも、PostgreSQLの拡張です。

関連項目

CREATE FUNCTION, CREATE TYPE, DROP CAST