結果データ・タイプの規則

結果のデータ・タイプは、 演算のオペランドに適用される規則によって決定されます。 ここでは、そのような規則について説明します。

これらの規則は以下に適用されます。
  • セット演算 (UNION、INTERSECT、および EXCEPT) の全選択における対応する列
  • CASE 式 および DECODE スカラー関数と NVL2 スカラー関数 の結果式
  • スカラー関数 COALESCE (また NVL および VALUE) の引数
  • スカラー関数 GREATEST、LEAST、MAX、および MIN の引数
  • IN 述部の IN リストの式値
  • 複数行の VALUES 節の対応する式
  • 配列コンストラクター内の要素のための式の値
  • BETWEEN 述部の引数 (すべてのオペランドのデータ・タイプが数値である場合を除く)
  • OLAP 仕様での集約グループの範囲用の引数

これらの規則は、さまざまな演算での長ストリングに関するその他の制限にも従って、適用されます。

さまざまなデータ・タイプに関係する規則を以下に示します。 一部については、考えられる結果データ・タイプを表に示します。 データ・タイプ LONG VARCHAR と LONG VARGRAPHIC は、引き続きサポートされていますが、非推奨になっています。

それらの表では、適用される長さまたは精度と位取りも含めて、結果データ・タイプを示します。 結果タイプは、オペランドを考慮して決定されます。 オペランドの対が複数の場合は、まず最初の対から検討します。 それによる結果タイプとその次のオペランドとの組み合わせが検討されて、 次の結果タイプが決定される、というようになります。 最後の中間結果タイプと最後のオペランドによって、その演算の最終的な結果タイプが決定されます。 演算処理は左から右へ行われます。 このため、演算が繰り返されるときは、中間結果タイプが重要になります。 例えば、以下のような演算を考えてみます。
   CHAR(2) UNION CHAR(4) UNION VARCHAR(3)
最初の対の結果のタイプは CHAR(4) です。 この結果の値は常に 4 バイトになります。 最終的な結果タイプは VARCHAR(4) です。 最初の UNION 演算の結果の値は、常に長さが 4 になります。

文字ストリング

文字ストリング値は、別の文字ストリング値と互換性があります。 文字ストリングには、データ・タイプ CHAR、VARCHAR、CLOB が含まれます。

一方のオペランド 他方のオペランド 結果のデータ・タイプ
CHAR(x) CHAR(y) CHAR(z) (z = max(x,y))
CHAR(x) VARCHAR(y) VARCHAR(z) (z = max(x,y))
VARCHAR(x) CHAR(y) または VARCHAR(y) VARCHAR(z) (z = max(x,y))
CLOB(x) CHAR(y)、VARCHAR(y)、または CLOB(y) CLOB(z) (z = max(x,y))

結果の文字ストリングのコード・ページは、 ストリング変換の規則に基づいて導き出されます。

Unicode データベースでは、オペランドのストリング単位が CODEUNITS32 で、派生コード・ページが 0 でない場合、結果の文字ストリングのストリング単位は CODEUNITS32 です。 オペランドが CODEUNITS32で定義されている場合、もう一方のオペランドを FOR BIT DATA.Otherwise 特殊なケースとして、あるオペランドのストリング単位が CODEUNITS32 で、もう一方のオペランドのストリング単位が CODEUNITS32 のデータ・タイプの最大値を超える長さ属性を持つ OCTETS である場合などがあります。
一方のオペランド 他方のオペランド 結果のデータ・タイプ
CHAR(x OCTETS) (x>63) CHAR(y CODEUNITS32) VARCHAR(z CODEUNITS32) (z = max(x,y))
VARCHAR(x OCTETS) (x>8168) CHAR(y CODEUNITS32) または VARCHAR(y CODEUNITS32) エラー
CLOB(x OCTETS) (x>536870911) CHAR(y CODEUNITS32)、VARCHAR(y CODEUNITS32)、 または CLOB(y CODEUNITS32) CLOB(536870911 CODEUNITS32)

GRAPHIC ストリング

GRAPHIC ストリング値は、別の GRAPHIC ストリング値と互換性があります。 GRAPHIC ストリングには、データ・タイプ GRAPHIC、VARGRAPHIC、DBCLOB が含まれます。

一方のオペランド 他方のオペランド 結果のデータ・タイプ
GRAPHIC(x) GRAPHIC(y) GRAPHIC(z) (z = max(x,y))
VARGRAPHIC(x) GRAPHIC(y) または VARGRAPHIC(y) VARGRAPHIC(z) (z = max(x,y))
DBCLOB(x) GRAPHIC(y)、VARGRAPHIC(y)、または DBCLOB(y) DBCLOB(z) (z = max(x,y))

結果の GRAPHIC ストリングのコード・ページは、 ストリング変換の規則に基づいて導き出されます。

Unicode データベースでは、オペランドのストリング単位が CODEUNITS32 で、派生コード・ページが 0 でない場合、結果の文字ストリングのストリング単位は CODEUNITS32 です。 オペランドが CODEUNITS32で定義されている場合、もう一方のオペランドを FOR BIT DATA.Otherwise 特殊なケースとして、あるオペランドのストリング単位が CODEUNITS32 で、もう一方のオペランドのストリング単位が CODEUNITS32 のデータ・タイプの最大値を超える長さ属性を持つ OCTETS である場合などがあります。 Unicode データベースでは、オペランドのストリング単位が CODEUNITS32、または CODEUNITS16 である場合、結果のグラフィック・ストリングのストリング単位は CODEUNITS32 です。 特殊なケースとして、あるオペランドのストリング単位が CODEUNITS32 で、もう一方のオペランドのストリング単位が CODEUNITS32 のデータ・タイプの最大値を超える長さ属性を持つ CODEUNITS16 である場合などがあります。
一方のオペランド 他方のオペランド 結果のデータ・タイプ
GRAPHIC(x CODEUNITS16) (x>63) GRAPHIC(y CODEUNITS32) VARGRAPHIC(z CODEUNITS32) (z = max(x,y))
VARGRAPHIC(x CODEUNITS16) (x>8168) GRAPHIC(y CODEUNITS32) または VARGRAPHIC(y CODEUNITS32) エラー
DBCLOB(x CODEUNITS16) (x>536870911) GRAPHIC(y CODEUNITS32)、VARGRAPHIC(y CODEUNITS32) または DBCLOB(y CODEUNITS32) DBCLOB(536870911 CODEUNITS32)

Unicode データベース内の文字ストリングおよび GRAPHIC ストリング

Unicode データベースでは、文字ストリング値と GRAPHIC ストリング値の間に互換性があります。

一方のオペランド 他方のオペランド 結果のデータ・タイプ
GRAPHIC(x) CHAR(y) または GRAPHIC(y) GRAPHIC(z) (z = max(x,y))
VARGRAPHIC(x) CHAR(y) または VARCHAR(y) VARGRAPHIC(z) (z = max(x,y))
VARCHAR(x) GRAPHIC(y) または VARGRAPHIC VARGRAPHIC(z) (z = max(x,y))
DBCLOB(x) CHAR(y)、VARCHAR(y)、または CLOB(y) DBCLOB(z) (z = max(x,y))
CLOB(x) GRAPHIC(y) または VARGRAPHIC(y) DBCLOB(z) (z = max(x,y))
オペランドのストリング単位が CODEUNITS32 または CODEUNITS16 である場合、結果のグラフィック・ストリングのストリング単位は CODEUNITS32 になります。 特殊なケースとして、あるオペランドのストリング単位が CODEUNITS32 で、もう一方のオペランドのストリング単位が、CODEUNITS32 のデータ・タイプの最大値を超える長さ属性を持つ OCTETS または CODEUNITS16 である場合などがあります。
一方のオペランド 他方のオペランド 結果のデータ・タイプ
CHAR(x OCTETS) (x>63) GRAPHIC(y CODEUNITS32) VARGRAPHIC(z CODEUNITS32) (z = max(x,y))
GRAPHIC(x CODEUNITS16) (x>63) CHAR(y CODEUNITS32) VARGRAPHIC(z CODEUNITS32) (z = max(x,y))
VARCHAR(x OCTETS) (x>8168) GRAPHIC(y CODEUNITS32) または VARGRAPHIC(y CODEUNITS32) エラー
VARGRAPHIC(x CODEUNITS16) (x>8168) CHAR(y CODEUNITS32) または VARCHAR(y CODEUNITS32) エラー
CLOB(x OCTETS) (x>536870911) GRAPHIC(y CODEUNITS32)、VARGRAPHIC(y CODEUNITS32)、 または DBCLOB(y CODEUNITS32) DBCLOB(536870911 CODEUNITS32)
DBCLOB(x CODEUNITS16) (x>536870911) CHAR(y CODEUNITS32)、VARCHAR(y CODEUNITS32)、 または CLOB(y CODEUNITS32) DBCLOB(536 870 911 CODEUNITS32)

バイナリー・ストリング

バイナリー・ストリングは他のバイナリー・ストリングや FOR BIT DATA 文字ストリングと互換性があります。 バイナリー・ストリングには、BINARY、VARBINARY、および BLOB が含まれます。

表 1. オペランドおよび結果データ・タイプ
一方のオペランド 他方のオペランド 結果のデータ・タイプ
BINARY(x) BINARY(y) または CHAR(y) FOR BIT DATA BINARY(z)。z=max(x,y)
VARBINARY(x) BINARY(y)、VARBINARY(y)、CHAR(y) FOR BIT DATA、または VARCHAR(y) FOR BIT DATA VARBINARY(z)。z=max(x,y)
VARCHAR(x) FOR BIT DATA BINARY(y) または VARBINARY(y) VARBINARY(z)。z=max(x,y)
BLOB(x) BINARY(y)、VARBINARY(y)、BLOB(y)、CHAR(y) FOR BIT DATA、または VARCHAR(y) FOR BIT DATA BLOB(z)。z=max(x,y)

Numeric

数値タイプは、他の数値データ・タイプ、文字ストリング・データ・タイプ (CLOB を除く) と互換性があり、Unicode データベースでは、GRAPHIC ストリング・データ・タイプ (DBCLOB を除く) とも互換性があります。 数値タイプには、SMALLINT、 INTEGER、 BIGINT、 DECIMAL、 REAL、 DOUBLE、および DECFLOAT が入ります。

表 2. オペランドおよび結果データ・タイプ
一方のオペランド 他方のオペランド 結果のデータ・タイプ
SMALLINT SMALLINT SMALLINT
SMALLINT ストリング DECFLOAT(34)
INTEGER SMALLINT または INTEGER INTEGER
INTEGER ストリング DECFLOAT(34)
BIGINT SMALLINT、INTEGER、または BIGINT BIGINT
BIGINT ストリング DECFLOAT(34)
DECIMAL(w,x) SMALLINT DECIMAL (p, x)、ただし
p = x + max (w-x,5)1
DECIMAL(w,x) INTEGER DECIMAL(p,x)、ただし
p = x+max(w-x,11)1
DECIMAL(w,x) BIGINT DECIMAL (p, x)、ただし
p = x + max (w-x,19)1
DECIMAL(w,x) DECIMAL(y,z) DECIMAL (p, s)、ただし
p = max (x, z) + max (w-x, y-z))1
s = max(x, z)
DECIMAL(w,x) ストリング DECFLOAT(34)
REAL REAL REAL
REAL SMALLINT、 INTEGER、 BIGINT、 または DECIMAL DOUBLE
REAL ストリング DECFLOAT(34)
DOUBLE SMALLINT、 INTEGER、 BIGINT、 DECIMAL、 REAL、 または DOUBLE DOUBLE
DOUBLE ストリング DECFLOAT(34)
DECFLOAT(n) SMALLINT、INTEGER、DECIMAL (<=16,s)、REAL、または DOUBLE DECFLOAT(n)
DECFLOAT(n) BIGINT または DECIMAL (>16,s) DECFLOAT(34)
DECFLOAT(n) DECFLOAT(m) DECFLOAT(max(n,m))
DECFLOAT(n) ストリング DECFLOAT(34)
1 精度は 31 以下でなければなりません。

Datetime

日時データ・タイプは、同じデータ・タイプのその他のオペランド、または同じデータ・タイプの有効なストリング表記を値とする任意の CHAR または VARCHAR 式と互換性があります。 また、DATE は TIMESTAMP と互換性があり、 TIMESTAMP の他方のオペランドはタイム・スタンプまたは日付のストリング表記にできます。 Unicode データベースでは、文字ストリングと GRAPHIC ストリングは互換性があります。 これは、日時値の GRAPHIC または VARGRAPHIC ストリング表記がその他の日時オペランドと互換性があることを意味します。

表 3. 日時オペランドに関する結果データ・タイプ
一方のオペランド 他方のオペランド 結果のデータ・タイプ
日数 DATE、CHAR(y)、または VARCHAR(y) 日数
時刻 TIME、CHAR(y)、または VARCHAR(y) 時刻
TIMESTAMP (x) TIMESTAMP (y) TIMESTAMP (最大 (x, y))
TIMESTAMP (x) DATE、CHAR(y)、または VARCHAR(y) TIMESTAMP (x)

XML

XML 値は、別の XML 値と互換性があります。 結果のデータ・タイプは XML です。

Boolean

ブール値は、別のブール値と互換性があります。 結果のデータ・タイプは BOOLEAN です。

ユーザー定義タイプ

特殊タイプ
厳密に型付けされた特殊タイプ値は、同じ特殊タイプの別の値のみと互換性があります。 結果のデータ・タイプは特殊タイプです。

両方のオペランドとも同一の緩やかに型付けされた特殊タイプである場合は、結果は特殊タイプになります。 それ以外の場合で、いずれかのオペランドが緩やかに型付けされた特殊タイプであれば、そのオペランドのデータ・タイプがソース・データ・タイプと見なされ、結果のデータ・タイプは組み込みデータ・タイプのオペランドの組み合わせに基づいて決まります。

配列データ・タイプ
ユーザー定義の配列データ・タイプ値は、同じユーザー定義の配列データ・タイプの別の値とのみ互換性があります。 結果のデータ・タイプはそのユーザー定義の配列データ・タイプです。
カーソル・データ・タイプ
CURSOR 値は、別の CURSOR 値と互換性があります。 結果のデータ・タイプは CURSOR です。 ユーザー定義のカーソル・データ・タイプ値は、同じユーザー定義のカーソル・データ・タイプの別の値とのみ互換性があります。 結果のデータ・タイプはそのユーザー定義のカーソル・データ・タイプです。
行データ・タイプ
ユーザー定義の行データ・タイプ値は、同じユーザー定義の行データ・タイプの別の値とのみ互換性があります。 結果のデータ・タイプはそのユーザー定義の行データ・タイプです。

参照タイプ

参照タイプ値は、同じ参照タイプの別の値と互換性がありますが、それは両方のターゲット・タイプが共通のスーパータイプを持っている場合に限ります。 結果のデータ・タイプは、 共通のスーパータイプをターゲット・タイプとして持っている参照タイプです。 すべてのオペランドに同じ有効範囲の表がある場合、 結果は有効範囲の表になります。 それ以外の場合、結果では効力範囲は指定されません。

構造化タイプ

構造化タイプ値は、同じ構造化タイプの別の値と互換性がありますが、それは両方が共通のスーパータイプを持っている場合に限ります。 結果の構造化タイプ列の静的データ・タイプは、 いずれかの列の最小限の共通スーパータイプである構造化タイプです。

例えば、以下の構造化タイプ階層について考えてみます。
      A
     / \
    B   C
   / \
  D   E
 / \
F   G
静的タイプ E と F の構造化タイプは、結果の静的タイプ B と互換性があります。 ただし、E および F の最小限の共通スーパータイプです。

結果の NULL 可能属性

INTERSECT と EXCEPT を除き、 2 つのオペランドの両方とも NULL 値が使用できないのでない限り、 結果で NULL 値が可能です。
  • INTERSECT で、どちらかのオペランドで NULL 値を使えない場合、 結果での NULL 値の使用は認められません (論理積が NULL 値になることはありません)。
  • EXCEPT では、最初のオペランドで NULL 値を使えない場合、 結果での NULL 値の使用は認められません (結果は最初のオペランドの値しか取れないためです)。