代入と比較
SQL の基本的な操作は、代入と比較です。
代入操作は、 INSERT、 UPDATE、 FETCH、 SELECT INTO、 VALUES INTO および SET 遷移変数ステートメントの実行中に行われます。 関数の引数も、関数の呼び出し時に代入されます。 比較操作は、述部および MAX、MIN、DISTINCT、GROUP BY、ORDER BY のような他の言語エレメントを含むステートメントの実行中に行われます。
両方の操作に適用される 1 つの基本的な規則は、関係するオペランドのデータ・タイプは互換でなければならないということです。 この互換性規則はセット演算にも適用されます。
代入操作の別の基本的な規則は、 NULL 値を入れることができない列や、 関連する標識変数がないホスト変数に、 NULL 値を代入することができないという規則です。
以下は、代入および比較操作のための組み込みのデータ・タイプの互換性を示す表です。
オペランド | 2 進整数 | 10 進数 | 浮動小数点数 | 10 進浮動小数点数 | 文字ストリング | グラフィック・ストリング | バイナリー・ストリング | 日付 | 時刻 | タイム・スタンプ | Boolean | UDT |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2 進整数 | はい | はい | はい | はい | あり | はい 5 | いいえ | いいえ | いいえ | いいえ | あり | 2 |
10 進数 | はい | はい | はい | はい | あり | はい 5 | いいえ | いいえ | いいえ | いいえ | いいえ | 2 |
浮動小数点 | はい | はい | はい | はい | あり | はい 5 | いいえ | いいえ | いいえ | いいえ | いいえ | 2 |
10 進浮動小数点数 | はい | はい | はい | はい | あり | はい 5 | いいえ | いいえ | いいえ | いいえ | いいえ | 2 |
文字ストリング | あり | あり | あり | あり | はい | はい 5、6 | はい 3 | あり | あり | あり | あり | 2 |
グラフィック・ストリング | はい 5 | はい 5 | はい 5 | はい 5 | はい 5、6 | はい | いいえ | はい 5 | はい 5 | はい 5 | あり | 2 |
バイナリー・ストリング | いいえ | いいえ | いいえ | いいえ | はい 3 | いいえ | はい | いいえ | いいえ | いいえ | いいえ | 2 |
日付 | いいえ | いいえ | いいえ | いいえ | あり | はい 5 | いいえ | はい | いいえ | あり | いいえ | 2 |
時刻 | いいえ | いいえ | いいえ | いいえ | あり | はい 5 | いいえ | いいえ | はい | 1 | いいえ | 2 |
タイム・スタンプ | いいえ | いいえ | いいえ | いいえ | あり | はい 5 | いいえ | あり | 1 | はい | いいえ | 2 |
Boolean | あり | いいえ | いいえ | いいえ | あり | あり | いいえ | いいえ | いいえ | いいえ | はい | 2 |
UDT | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | はい |
1 TIMESTAMP 値は、TIME 値に代入することができます。ただし、TIME 値は TIMESTAMP 値に代入できず、また TIMESTAMP 値は TIME 値と比較することもできません。 2 詳細なユーザー定義タイプ情報については、「 ユーザー定義タイプの割り当て 」および「 ユーザー定義タイプの比較」を参照してください。 3 FOR BIT DATA を指定した場合を除き、文字ストリングには、バイナリー・ストリングとの互換性がありません。 FOR BIT DATA の文字ストリングとバイナリー・ストリングは互換性があると見なされ、ターゲットのデータ・タイプに基づいて埋め込みが実行されます。 例えば、FOR BIT DATA の列値を固定長バイナリー・ホスト変数に代入する場合は、埋め込みバイト X'00' によって必要な埋め込みが行われます。 4 参照タイプの割り当ておよび比較については、「 参照タイプの割り当て 」および「 参照タイプの比較」を参照してください。 5 Unicode データベースの場合にのみサポートされます。 6 ビット・データと GRAPHIC ストリングは互換性がありません。 |
数値割り当て
- 厳密な数値データ・タイプへの代入では、数値の整数部分のいずれかの桁が除去されると、オーバーフローが発生します。 必要な場合には、数値の小数部分が切り捨てられます。
- 近似値データ・タイプまたは 10 進浮動小数点数への代入では、数値の整数部分の最上位桁が除去されると、オーバーフローが発生します。 浮動小数点数および 10 進浮動小数点数では、数値の整数部分は、浮動小数点数または 10 進浮動小数点数が無制限の精度を持つ 10 進数に変換された場合にその結果となる数値です。 必要な場合には、丸めによって数値の最下位桁が除去される場合があります。
10 進浮動小数点数では、数値の整数部分の切り捨てが許可されており、これが行われると結果は無限大になり警告が出されます。
浮動小数点数では、アンダーフローも許可されていません。 アンダーフローは、1 と -1 の間の数値において、ゼロ以外の最上位桁が除去される場合に発生します。 10 進浮動小数点数では、アンダーフローが許可されていて、丸めモードに応じて、ゼロ、または最小の正数または最大の負の数値 (警告付きで表示可能) となります。
標識変数を持つホスト変数への代入でオーバーフローまたはアンダーフローが発生する場合には、エラーの代わりにオーバーフローまたはアンダーフローの警告が返されます。 この場合、数値はホスト変数に代入されず、標識変数はマイナス 2 に設定されます。
10 進浮動小数点数では、CURRENT DECFLOAT ROUNDING MODE 特殊レジスターが、実行されている丸めモードを示します。
整数への代入
10 進数、浮動小数点数、または 10 進浮動小数点数が、整数の列または整数変数に代入された場合、その数の小数部分が除去されます。 結果として、1 と -1 の間の数値は 0 になります。
10 進数への代入
整数を 10 進数の列または変数に代入するときは、まず数値が一時的な 10 進数へ変換された後、必要であれば、ターゲットの精度と位取りに変換されます。 一時的な 10 進数の精度と位取りは、短精度整数では 5,0、長精度整数では 11,0、 64 ビット整数では 19,0 です。
10 進数が 10 進数の列または変数に代入される場合、その数値は、必要に応じてターゲットの精度および位取りに変換されます。 必要な数だけ先行ゼロが追加されます。また、10 進数の小数部分では、必要な数の後続ゼロが追加されるか、または必要な数の末尾桁が除去されます。
浮動小数点数を 10 進数の列または変数に代入するときは、まず数値が精度 31 の一時的な 10 進数へ変換された後、必要なら、ターゲットの精度と位取りまで切り捨てられます。 この変換では、 数値は精度 31 の 10 進数に (浮動小数点数算術演算を使って) 丸められます。 その結果、その 10 進数の列または変数内の表現可能な最小の正数より小さい、または最大の負数より大きい、1 と -1 の間の数値が 0 に減らされます。 位取りは、有意性を失うことなく数値の整数部分を表すことができる、可能な最大値になります。
10 進浮動小数点数が 10 進数の列または変数に代入される場合、その数値は、その 10 進数の列または変数の精度および位取りに丸められます。 その結果、1 と -1 の間で、10 進数の列または変数で示すことができる最小の正数未満の数値または最大の負の数値より大きい数値は 0 になるか、10 進数の列または変数で示すことができる最小の正の値または最大の負の値に丸められます (丸めモードにより異なる)。
浮動小数点数への代入
浮動小数点数は、実数の近似値です。 したがって、整数、10 進数、浮動小数点数、または 10 進浮動小数点数が浮動小数点数の列または変数に代入された場合、その結果が元の数値と異なってくる可能性があります。 数値は、浮動小数点算術計算を使用して浮動小数点数の列または変数の精度に丸められます。 10 進浮動小数点値は、まずストリング表記に変換され、その後浮動小数点数に変換されます。
10 進浮動小数点数への代入
整数を 10 進浮動小数点数の列または変数に代入するときは、まず数値が一時的な 10 進数へ変換された後、10 進浮動小数点数に変換されます。 一時的な 10 進数の精度と位取りは、短精度整数では 5,0、長精度整数では 11,0、 64 ビット整数では 19,0 です。 BIGINT を DECFLOAT(16) の列または変数に代入するときに丸めが行われる場合があります。
10 進数が 10 進浮動小数点数の列または変数に代入されるとき、その数値は、ターゲットの精度 (16 または 34) に変換されます。 先行ゼロは除去されます。 10 進数の精度と位取り、およびターゲットの精度に応じて、値が丸められる場合があります。
浮動小数点数を 10 進浮動小数点数の列または変数に代入されるときは、まず数値が一時的な浮動小数点数のストリング表記へ変換されます。 数値のストリング表記は次に、10 進浮動小数点数に変換されます。
DECFLOAT(16) の数値を DECFLOAT(34) の列または変数に代入するとき、結果の値は DECFLOAT(16) の数値と同一になります。
DECFLOAT(34) の数値を DECFLOAT(16) の列または変数に代入するとき、ソースの指数は代入先の形式の対応する指数に変換されます。 DECFLOAT(34) の数値の小数部は、ターゲットの精度に丸められます。
ストリングから数値への代入
ストリングを数値データ・タイプに代入する場合、ストリングは CAST 指定のための規則を使用してターゲットの数値データ・タイプに変換されます。
ストリング代入
- ストレージ代入 では、値が代入され、有効なデータの切り捨ては望ましくありません (値を列に代入した場合など)。
- 検索代入 では、値が代入され、切り捨ては許可されます (データをデータベースから検索する場合など)。
ストリング代入の規則は、代入のタイプとストリングのタイプによって異なります。
バイナリー・ストリングの代入
- ストレージ代入
- バイナリー・ストリングのターゲットに代入するストリングの長さがターゲットの長さ属性を超えてはなりません。 ストリングの長さがターゲットの長さ属性を超えた場合は、以下の処置が取られることがあります。
- ストリングの代入時に、ターゲットの長さ属性に合わせて末尾の16 進ゼロ (X'00') が切り捨てられます (BLOB ストリング以外)。
- 以下のような切り捨てが行われる場合は、エラーが戻されます (SQLSTATE 22001)。
- BLOB ストリング以外のバイナリー・ストリングから 16 進ゼロ (X'00) 以外の文字が切り捨てられるとき。
- BLOB ストリングから任意の文字 (またはバイト) が切り捨てられるとき
固定長バイナリーのターゲットにストリングを代入する場合に、ストリングの長さがターゲットの長さ属性よりも短ければ、そのストリングの右側に必要な数の 16 進ゼロが埋め込まれます。
- 検索代入
- ターゲットに代入されるストリングの長さは、ターゲットの長さ属性より長くても構いません。 ストリングをターゲットに代入するときに、ストリングの長さがターゲットの長さ属性よりも長ければ、ストリングの右側から必要な数のバイトが切り捨てられます。 この切り捨てが起きると、警告が戻されます (SQLSTATE 01004)。
さらに、ホスト変数に代入するデータが切り捨てられると、SQLCA の SQLWARN1 フィールドに値 'W' が割り当てられます。 また、標識変数を指定した場合に、その値のソースが LOB でなければ、その標識変数はストリングの元の長さに設定されます。
固定長のターゲットにストリングを代入する場合に、ストリングの長さがターゲットの長さ属性よりも短ければ、そのストリングの右側に必要な数の 16 進ゼロが埋め込まれます。
文字ストリングとグラフィック・ストリングの代入
- ストレージ代入
- 基本的な規則は、ターゲットに代入されるストリングの長さが、ターゲットの長さ属性を超えてはならないということです。 ストリングの長さがターゲットの長さ属性を超えた場合は、以下の処置が取られることがあります。
- ストリングは、ターゲットの長さ属性に適合するように、(LOB ストリングを除くすべてのストリング・タイプから) 後続ブランクが切り捨てられた上で代入されます。
- 以下のような切り捨てが行われる場合は、エラーが戻されます (SQLSTATE 22001)。
- LOB ストリング以外のストリングからブランク以外の文字が切り捨てられるとき
- LOB ストリングから任意の文字 (またはバイト) が切り捨てられるとき
Unicode データベースでは、長さは、ターゲットのストリング単位でコード単位数として定義されます。- ターゲット・ストリング単位が OCTETS である場合、ターゲットに割り当てられたストリングのバイト長をターゲットより長くすることはできません。
- ターゲット・ストリング単位が CODEUNITS16 である場合、ターゲットに割り当てられたストリングの Unicode UTF-16 コード単位数をターゲットの長さ属性より大きくすることはできません。
- ターゲット・ストリング単位が CODEUNITS32 である場合、ターゲットに割り当てられたストリングの Unicode UTF-32 コード単位数をターゲットの長さ属性より大きくすることはできません。
ストリングが固定長ターゲットに割り当てられる際に、ストリングの長さがターゲットの長さ属性よりも短い場合、 ストリングの右端に必要な数の 1 バイト、2 バイト、または UCS-2 のブランクが埋め込まれます。 埋め込み文字は、FOR BIT DATA 属性で定義されている列の場合も含めて、常にブランクです。 (UCS-2 は、いくつかの SPACE 文字を異なるプロパティーで定義します。 Unicode データベースの場合、 データベース・マネージャーは、常に、 UCS-2 ブランクとして位置 x'0020' にある ASCII SPACE を使用します。 EUC データベースの場合、位置 x'3000' にある IDEOGRAPHIC SPACE は、 埋め込み GRAPHIC ストリングに使用されます。)
- 検索代入
- ターゲットに代入されるストリングの長さは、ターゲットの長さ属性より長くても構いません。 ストリングがターゲットに割り当てられるときに、ストリングの長さがターゲットの長さ属性より長ければ、
ストリングの右側から文字 (またはバイト) が必要な数だけ切り捨てられます。 この切り捨てが起きると、警告が戻されます (SQLSTATE 01004)。
さらに、ホスト変数に代入するデータが切り捨てられると、SQLCA の SQLWARN1 フィールドに値 'W' が割り当てられます。 また、標識変数を指定した場合に、その値のソースが LOB でなければ、その標識変数はストリングの元の長さに設定されます。
長さは、ターゲットのストリング単位でコード単位数として定義されます。- ターゲット・ストリング単位が OCTETS であり、ソース・ストリングのバイト長がターゲットより長い場合、ストリングの右からバイトが必要な数だけ切り捨てられます。
- ターゲット・ストリング単位が CODEUNITS16 であり、ソース・ストリングの Unicode UTF-16 コード単位数がターゲットの長さ属性より大きい場合、ストリングの右から Unicode UTF-16 コード単位が必要な数だけ切り捨てられます。
- ターゲット・ストリング単位が CODEUNITS32 であり、ソース・ストリングの Unicode UTF-32 コード単位数がターゲットの長さ属性より大きい場合、ストリングの右から Unicode UTF-32 コード単位が必要な数だけ切り捨てられます。
文字ストリングが固定長ターゲットに代入される際に、ストリングの長さがターゲットの長さ属性よりも短い場合、ストリングの右端に必要な数の 1 バイト、2 バイト、または UCS-2 のブランクが埋め込まれます。 埋め込み文字は、FOR BIT DATA 属性で定義されているストリングの場合も含めて、 常にブランクです。 (UCS-2 は、いくつかの SPACE 文字を異なるプロパティーで定義します。 Unicode データベースの場合、 データベース・マネージャーは、常に、 UCS-2 ブランクとして位置 x'0020' にある ASCII SPACE を使用します。 EUC データベースの場合、位置 x'3000' にある IDEOGRAPHIC SPACE は、 埋め込み GRAPHIC ストリングに使用されます。)
C の NUL 終了ホスト変数の検索代入は、PREP コマンドか BIND コマンドで指定されたオプションに基づいて処理されます。
ストリング代入に関する変換規則
- コード・ページが異なる。
- ストリングが NULL でも空でもない。
- どちらのストリングのコード・ページ値も 0 (FOR BIT DATA) でない。
Unicode データベースの場合、GRAPHIC 列に文字ストリングを代入することができ、文字の列にグラフィック・ストリングを代入することができます。
文字ストリング代入に関する MBCS の考慮事項
- ブランクの埋め込みは、常に単一バイトのブランク文字 (X'20') を使用して行われます。
- ブランクの切り捨ては、常に単一バイトのブランク文字 (X'20') に基づいて行われます。 切り捨てに関しては、2 バイトのブランク文字はその他の文字と同様に扱われます。
- 文字ストリングをホスト変数に代入する場合に、代入先のホスト変数にソース・ストリング全体を収めるだけの長さがないなら、MBCS 文字のフラグメント化が発生する場合があります。 MBCS 文字がこのようにフラグメント化される場合は、MBCS 文字フラグメントの各バイトがターゲットで 1 バイトのブランク文字 (X'20') に設定されます。それ以降のバイトに関してはソースからの移動は行われず、SQLWARN1 が 'W' に設定されて切り捨ての発生を示します。 MBCS 文字のフラグメント化に関するこの処理は、 文字ストリングが FOR BIT DATA と定義されている場合にも同じであることに注意してください。
GRAPHIC ストリング代入に関する DBCS の考慮事項
GRAPHIC ストリング代入は、文字ストリングに似た方法で処理されます。 非 Unicode データベースの場合、GRAPHIC ストリング・データ・タイプが互換であるのは他のグラフィック・ストリング・データ・タイプとだけであり、 数値、文字ストリング、日付/時刻データ・タイプとは互換ではありません。 Unicode データベースの場合、GRAPHIC ストリングのデータ・タイプは、 文字ストリングのデータ・タイプと互換性があります。 ただし、SELECT INTO または VALUES INTO ステートメントの中では、GRAPHIC ストリングのデータ・タイプと文字ストリングのデータ・タイプを相互に交換可能なものとして使用することはできません。
GRAPHIC ストリング値がグラフィック・ストリング列に代入される場合、 その値の長さがその列の長さを超えてはなりません。
GRAPHIC ストリング値 (「ソース」ストリング) を固定長グラフィック・ストリング・データ・タイプ (「ターゲット」。列、変数、またはパラメーターとすることができます) に代入する場合に、ソース・ストリングの長さがターゲットより短いなら、代入先には、ソース・ストリングのコピーの右端に、値の長さをターゲットの長さに等しくするために必要な数の 2 バイト・ブランク文字を埋め込んだものが入れられます。
GRAPHIC ストリング値をグラフィック・ストリングのホスト変数に代入する場合に、 ソース・ストリングの長さがホスト変数の長さよりも長いなら、 ホスト変数には、ソース・ストリングのコピーの右端から、 値の長さがホスト変数の長さと等しくなるために必要な数の 2 バイト・ブランク文字を切り捨てたものが入れられます。 (このシナリオでは、切り捨てにおいて 2 バイト文字の二分化を考慮する必要はありません。 二分化が発生したら、 それはソース値または代入先のホスト変数のどちらかでグラフィック・ストリング・データ・タイプの定義に異常があるということです。) SQLCA の警告フラグ SQLWARN1 が「W」に設定されます。 標識変数が指定されていれば、 標識変数にはソース・ストリングの元の長さ (2 バイト文字の文字数) が入れられます。 しかし、DBCLOB の場合は、標識変数に元の長さは入れられません。
C の NUL 終了ホスト変数 (wchar_t を使って宣言されたもの) の検索代入は、PREP または BIND コマンドに指定されたオプションに基づいて処理されます。
数値からストリングへの代入
数値をストリング・データ・タイプに代入する場合、数値は CAST 指定のための規則を使用してターゲット・ストリングのデータ・タイプに変換されます。
非ブランク文字が数値の文字またはグラフィック・データ・タイプへのキャスト中に切り捨てられた場合は、警告が戻されます。 この切り捨て動作は、非ブランク文字が代入中に切り捨てられた場合にエラーが戻される、ストレージ代入規則に従う文字またはグラフィック・データ・タイプへの代入とは異なります。
日時の割り当て
TIME 値は、TIME 列、あるいはストリング変数またはストリング列のみに代入できます。
DATE は、DATE、TIMESTAMP、またはストリングのデータ・タイプに代入できます。 DATE 値を TIMESTAMP データ・タイプに代入すると、不足する時刻情報はすべてゼロであるとみなされます。
TIMESTAMP 値は、DATE、TIME、TIMESTAMP、またはストリングのデータ・タイプに代入できます。 TIMESTAMP 値を DATE データ・タイプに代入すると、日付の部分が抜き出され、時刻の部分は切り捨てられます。 TIMESTAMP 値を TIME データ・タイプに代入すると、日付の部分は無視され、時刻の部分が抜き出されますが小数秒は切り捨てられます。 TIMESTAMP 値をより精度が低い TIMESTAMP に代入すると、余分の小数秒は切り捨てられます。 TIMESTAMP 値をより精度が高い TIMESTAMP に代入すると、不足する桁はゼロであるとみなされます。
CLOB、DBCLOB または BLOB の変数または列に代入することはできません。
日付/時刻値をストリング変数またはストリング列に代入するときは、 ストリング表記に自動的に変換されます。 日付、時刻、タイム・スタンプのどの部分からも先行ゼロが省略されることはありません。 ターゲットで必要な長さは、ストリング表記の形式によって異なります。 ターゲットの長さが必要よりも長く、ターゲットが固定長ストリングである場合は、ターゲットの右端にブランクが埋め込まれます。 ターゲットの長さが必要よりも短い場合は、関係する日付/時刻値のタイプとターゲットのタイプによって結果が異なります。
ターゲットがホスト変数以外で、文字データ・タイプの場合、切り捨ては許可されません。 列の長さ属性は、日付の場合は少なくとも 10、時刻の場合は 8、TIMESTAMP(0) の場合は 19、TIMESTAMP(p) の場合は 20+p でなければなりません。
- DATE の場合: ホスト変数の長さが 10 文字未満であればエラーが返されます。
- TIME の場合: USA 形式では 8 文字未満の長さのホスト変数を使用できません。その他の形式では 5 文字未満の長さにすることはできません。
ISO または JIS 形式を使用しホスト変数の長さが 8 文字未満の場合、時刻の秒の部分は結果から省略され、標識変数があれば、その変数に代入されます。 SQLCA の SQLWARN1 フィールドに、省略処理を示す値が設定されます。
- TIMESTAMP の場合: ホスト変数の長さが 19 文字未満であればエラーが返されます。 長さが 19 文字以上 32 文字未満の場合、値の小数秒部分の末尾桁が省略されます。 SQLCA の SQLWARN1 フィールドに、省略処理を示す値が設定されます。
DATE を TIMESTAMP に代入すると、タイム・スタンプの時刻と小数秒の構成要素はそれぞれ午前 0 時と 0 に設定されます。 TIMESTAMP を DATE に代入すると、日付の部分が抜き出され、時刻と小数秒の構成要素は切り捨てられます。
TIMESTAMP を TIME に代入すると、DATE の部分は無視され、小数秒の構成要素は切り捨てられます。
XML の代入
XML 代入の一般規則として、XML 値だけを XML 列または XML 変数に代入することができます。 その規則の例外は次のとおりです。
- 入力 XML ホスト変数を処理する場合: これは XML 代入規則の特殊ケースです。ホスト変数はストリング値を基にしているためです。 SQL 内で XML への代入を行うため、ストリング値が暗黙で解析されて XML 値になります。その際、CURRENT IMPLICIT XMLPARSE OPTION 特殊レジスターの設定が使用されて、 空白を残すか除去するかが決まります。ただし、ホスト変数が XMLVALIDATE 関数の引数である場合は例外で、その場合は不要な空白が常に除去されます。
- データ・タイプ XML の入力パラメーター・マーカーにストリングを代入する場合: 入力パラメーター・マーカーの暗黙的または明示的なデータ・タイプが XML の場合、そのパラメーター・マーカーにバインドする (代入する) 値は、文字ストリング変数、GRAPHIC ストリング変数、またはバイナリー・ストリング変数のいずれでも構いません。 その場合、ストリング値が暗黙で解析されて XML 値になります。その際、CURRENT IMPLICIT XMLPARSE OPTION 特殊レジスターの設定が使用されて、空白を残すか除去するかが決まります。ただし、パラメーター・マーカーが XMLVALIDATE 関数の引数である場合は例外で、その場合は不要な空白が常に除去されます。
- データ変更ステートメントで XML 列にストリングを直接代入する場合: データ変更ステートメントでタイプが XML の列に直接代入する場合、代入される式は文字ストリングまたはバイナリー・ストリングにできます。 この場合、
XMLPARSE (DOCUMENT expression STRIP WHITESPACE)
の結果がターゲット列に代入されます。 サポートされるストリングのデータ・タイプは、XMLPARSE 関数用のサポートされている引数で定義されます。 このような XML 代入の例外があっても、文字ストリングまたはバイナリー・ストリングの値を SQL 変数や、データ・タイプが XML の SQL パラメーターに代入することはできないことに注意してください。 - 取り出し時に XML をストリングに代入する場合: 組み込み SQL 内で FETCH INTO ステートメントまたは EXECUTE INTO ステートメントを使用して、XML 値をホスト変数に取り出す場合、そのホスト変数のデータ・タイプは、CLOB、DBCLOB、または BLOB のいずれでも構いません。 他のアプリケーション・プログラミング・インターフェース (CLI、JDBC、または .NET など) を使用する場合、該当するアプリケーション・プログラミング・インターフェースでサポートされている文字、GRAPHIC、またはバイナリーのストリング・タイプで XML 値を取り出すことができます。 これらのどの場合でも、XML 値は、UTF-8 でエンコードされたストリングに暗黙的にシリアライズされ、文字またはグラフィック・ストリング変数の場合は、クライアント・コード・ページに変換されます。
文字ストリングまたはバイナリー・ストリングの値を XML ホスト変数に取り出すことはできません。 XML ホスト変数内の値を、文字ストリング・データ・タイプまたはバイナリー・ストリング・データ・タイプの、列、SQL 変数、または SQL パラメーターに代入することはできません。
インライン化 SQL を本体として持つ UDF と SQL プロシージャーでの XML パラメーターと変数への代入は、参照によって行われます。 インライン化 SQL UDF または SQL プロシージャー を呼び出すためにデータ・タイプ XML のパラメーターを渡すことも、参照によって行われます。 参照によって XML 値を渡すときには、入力ノード・ツリーが直接使用されます。 この直接的な使用により、文書の順序、元のノード ID、およびすべての親プロパティーを含むすべてのプロパティーが保持されます。
ユーザー定義タイプの割り当て
ユーザー定義タイプの値を使用する代入では、一般的に、同じユーザー定義タイプの名前に対する代入が可能です。ただし、さまざまな種類のユーザー定義タイプについて追加の規則がいくつかあります。 特定のユーザー定義タイプに関する追加情報は、次のセクションに記述されています。
厳密に型付けされた特殊タイプの代入
- ホスト変数への代入
- 厳密に型付けされた特殊タイプ値のホスト変数 (またはパラメーター・マーカー) への代入は、その特殊タイプのソース・データ・タイプに基づきます。 したがって、厳密に型付けされた特殊タイプの値をホスト変数 (またはパラメーター・マーカー) に代入できるのは、この特殊タイプのソース・データ・タイプをこの変数に代入できる場合のみです。例えば、以下の SQL ステートメントによって特殊タイプ AGE が作成されるとします。
このステートメントを実行すると、以下のキャスト関数も生成されます。CREATE TYPE AGE AS SMALLINT
次に、表 STUDENTS の STU_AGE 列に特殊タイプ AGE が定義されたと想定します。 ここで、データ・タイプが INTEGER の ホスト変数 HV_AGE に、学生の年齢を有効に代入することについて検討します。AGE (SMALLINT) RETURNS AGE AGE (INTEGER) RETURNS AGE SMALLINT (AGE) RETURNS SMALLINT
特殊タイプのソース・データ・タイプ (SMALLINT) はホスト変数 (INTEGER) に代入できるので、厳密に型付けされた特殊タイプの値をホスト変数 HV_AGE に代入できます。 厳密に型付けされた特殊タイプ AGE が DATE のような日時データ・タイプをソースとしていた場合、日時データ・タイプは整数タイプに代入できないため、前述の代入は無効になります。SELECT STU_AGE INTO :HV_AGE FROM STUDENTS WHERE STU_NUMBER = 200
- ホスト変数以外への代入
- 厳密に型付けされた特殊タイプは、代入のソースとターゲットのいずれにもなり得ます。 代入は、代入される値のデータ・タイプがターゲットのデータ・タイプにキャスト可能かどうかに基づきます (特殊タイプが関係する場合にサポートされるキャストについては、 データ・タイプ間のキャスト を参照してください)。 以下の場合に、厳密に型付けされた特殊タイプ値をホスト変数以外のターゲットに代入できます。
- 代入のターゲットが同じ特殊タイプである。
- 特殊タイプをターゲットのデータ・タイプにキャストできる。
- 代入される値がターゲットと同じ特殊タイプである。
- 代入される値のデータ・タイプをターゲットの特殊タイプにキャストできる。
例えば、厳密に型付けされた特殊タイプ AGE のソース・データ・タイプが SMALLINT であるとします。
次に、表 TABLE1 と TABLE2 を、以下の 4 つの同じ列記述を使用して 作成するとします。CREATE TYPE AGE AS SMALLINT
以下の SQL ステートメントを使用し、X と Y のさまざまな 値を置き換えて、TABLE2 から TABLE1 のさまざまな列に値を挿入します。 データベース・マネージャーは、この INSERT ステートメントで割り当て規則を使用して、X を Y に代入できるかどうかを判別します。 表 2 に、割り当てが有効かどうかを示します。AGECOL AGE SMINTCOL SMALLINT INTCOL INTEGER DECCOL DECIMAL(6,2)
INSERT INTO TABLE1(Y) SELECT X FROM TABLE2;
表 2. さまざまな代入の評価 TABLE2.X TABLE1.Y 有効 理由 AGECOL AGECOL はい ソースとターゲットが同じ特殊タイプ SMINTCOL AGECOL はい SMALLINT を AGE にキャストできる INTCOL AGECOL はい AGE のソース・タイプが SMALLINT なので AGE に INTEGER をキャストできる DECCOL AGECOL いいえ DECIMAL を AGE にキャストできない AGECOL SMINTCOL はい AGECOL をそのソース・タイプ SMALLINT にキャストできる AGECOL INTCOL いいえ AGE を INTEGER にキャストできない AGECOL DECCOL いいえ AGE を DECIMAL にキャストできない
緩やかに型付けされた特殊タイプの代入
緩やかに型付けされた特殊タイプのソース・タイプの代入規則に従って、緩やかに型付けされた特殊タイプの値を代入できます。 代入のターゲットが、データ・タイプ制約を使用して定義されている特殊タイプである場合、そのデータ・タイプ制約は、ソース値に適用され、真または不明と評価されなければなりません。
構造化タイプの代入
構造化タイプの値は、代入のターゲットも同じ構造化タイプである場合か、そのスーパータイプのいずれかである場合に代入することができます。ただし、ホスト変数を使用する場合は例外です。
- 構造化タイプのソース値をターゲットのホスト変数に代入できるのは、 ホスト変数の宣言タイプが構造化タイプであるか、または構造化タイプのスーパータイプである場合に限られます。
代入のターゲットが、構造化タイプの列である場合、ソース・データ・タイプは、ターゲット・データ・タイプ、またはターゲット・データ・タイプのサブタイプでなければなりません。
配列タイプの代入
配列のエレメントの値は、配列エレメントのデータ・タイプに代入可能でなければなりません。 このデータ・タイプの代入規則が、値の代入に適用されます。 配列内の索引に指定する値は、配列の索引のデータ・タイプに代入可能でなければなりません。 このデータ・タイプの代入規則が、値の代入に適用されます。 通常配列の場合、索引データ・タイプは INTEGER であり、連想配列の場合にはデータ・タイプは INTEGER または VARCHAR(n) になります。ここで、n は VARCHAR データ・タイプの有効な長さ属性です。 通常配列に対する代入の索引値が現在の配列のカーディナリティーよりも大きい場合、配列のカーディナリティーの値は INTEGER データ・タイプの最大値を超えない範囲で、新しい索引値にまで増えます。 連想配列に対して新規エレメントを 1 つ代入する場合、索引値が分散可能なため、正確に 1 ずつカーディナリティーが増えます。
- 割り当ての右側が SQL 変数またはパラメーター、TRIM_ARRAY 関数の呼び出し、 ARRAY_DELETE 関数の呼び出し、または CAST 式の場合、そのタイプは、割り当ての左側にある SQL 変数またはパラメーターのタイプと同じでなければなりません。
- 代入の右辺が配列コンストラクターまたは ARRAY_AGG 関数の呼び出しである場合、それは左辺の SQL 変数またはパラメーターのタイプに暗黙的にキャストされます。
SET V = ARRAY[1,2,3];
これは、以下と同じ意味になります。SET V = CAST(ARRAY[1,2,3] AS MYARRAY);
さらに次のステートメントがあるとします。SELECT ARRAY_AGG(C1) INTO V FROM T
これは、以下と同じ意味になります。SELECT CAST(ARRAY_AGG(C1) AS MYARRAY) INTO V FROM T
- 配列変数を、ソース変数と同じ配列タイプの別の配列変数へ代入する場合。
- タイプが配列である式を、配列変数へ代入する場合 (ソース式の配列エレメントのタイプが、ターゲット配列変数の配列エレメントのタイプに代入可能な場合)。
行タイプの代入
行変数内のフィールドへの代入は、フィールド自体がそのフィールドと同じデータ・タイプの変数である場合と同じ規則に従う必要があります。 行変数は、同じユーザー定義行タイプの行変数のみに代入することができます。 FETCH、SELECT、または VALUES INTO を使用して値を行変数に代入する場合、ソースの値の各タイプはターゲットの行の各フィールドに代入可能でなければなりません。 割り当てのソース変数またはターゲット変数 (あるいはその両方) が表またはビューの行にアンカーされている場合、フィールドの数は同じでなければならず、ソース値のフィールド・タイプはターゲット値のフィールド・タイプに割り当て可能でなければなりません。
カーソル・タイプの代入
- カーソルの値コンストラクター
- 組み込みタイプの CURSOR の値
- すべてのユーザー定義のカーソル・タイプの値
- カーソルの値コンストラクター
- 組み込みタイプの CURSOR の値
- 同じタイプ名のユーザー定義のカーソル・タイプの値
- カーソルの値コンストラクター
- 同じタイプ名のユーザー定義のカーソル・タイプの値
ブール・タイプの代入
- はい
- いいえ
- ヌル
参照タイプの代入
ターゲット・タイプが T である参照タイプは、ターゲット・タイプが S である参照タイプ列に代入することができます (S は T のスーパータイプです)。 有効範囲が指定されている参照列または参照変数に代入が行われる場合、代入されている実際の値が、有効範囲で定義されているターゲット表またはターゲット・ビューに存在することを確認するためのチェックは行われません。
- 代入の右辺の参照タイプの値が左辺のホスト変数に代入可能なのは、右辺の参照タイプの表示タイプがこのホスト変数に代入可能な場合だけです。
代入のターゲットが列で、その代入の右辺にホスト変数が指定されている場合、 そのホスト変数はそのターゲット列の参照タイプに明示的にキャストされなければなりません。
数値比較
数値は代数的に、つまり符号を考慮して比較されます。 例えば、-2 は +1 より小さい値として扱われます。
一方が整数で、もう一方が 10 進数の場合、 10 進数に変換された整数の一時コピーが比較に使用されます。
位取りの異なる 10 進数を比較する場合、 比較は、一方の数値の小数部分が、他方の数値の小数部分と同じ桁数になるように、 後続ゼロを使って拡張されたその数値の一時コピーを使用して行われます。
一方が浮動小数点数で、他方が整数か 10 進数の場合、 この後者の数値を倍精度浮動小数点数に変換したものの一時コピーが比較に使用されます。
2 つの浮動小数点値が等しいのは、正規形のビット構成が同一の場合のみです。
一方が 10 進浮動小数点数で、他方の数値が整数、10 進数、単精度浮動小数点数、または倍精度浮動小数の場合、この後者の数値を 10 進浮動小数点数に変換したものの一時コピーが比較に使用されます。
一方の数値が DECFLOAT(16) で、他方の数値が DECFLOAT(34) の場合、比較される前に DECFLOAT(16) 値は DECFLOAT(34) に変換されます。
10 進浮動小数点データ・タイプは、正のゼロと負のゼロの両方をサポートしています。 正のゼロと負のゼロのバイナリー表記は異なりますが、負のゼロと正のゼロを比較すると = (等しい) 述部は true を戻します。
例えば 2.0 <> 2.00 の比較が必要な場合、COMPARE_DECFLOAT および TOTALORDER スカラー関数を使用してバイナリー・レベルの比較を行えます。
10 進浮動小数点データ・タイプは、負の NaN と正の NaN (静止およびシグナル)、および負の無限大と正の無限大の指定をサポートしています。 SQL の観点から見ると、INFINITY = INFINITY、NAN = NAN、SNAN = SNAN、および -0 = 0 です。
- (+/-) INFINITY は、同符号の (+/-) INFINITY とのみ等しく比較されます。
- (+/-) NAN は、同符号の (+/-) NAN とのみ等しく比較されます。
- (+/-) SNAN は、同符号の (+/-) SNAN とのみ等しく比較されます。
- -NAN < -SNAN < -INFINITY < 0 < INFINITY < SNAN < NAN
ストリング・データ・タイプと数値データ・タイプを比較すると、ストリングは CAST 指定のための規則を使用して DECFLOAT(34) にキャストされます。 このストリングには、数値の有効な文字ストリング表記が含まれていなければなりません。
ストリングの比較
- バイナリー・ストリングの比較
- バイナリー・ストリングの比較では、両方のストリングの対応するバイトのバイナリー値が常に比較されます。 2 つのバイナリー・ストリングが等しくなるのは、その 2 つのバイナリー・ストリングの長さが同じ場合に限られます。 長さが違う場合は、他の要素が等しくても、短いほうのストリングが長いほうのストリングより小さいと見なされます。 バイナリー・ストリングと文字ストリングを比較することはできません。ただし、文字ストリングをバイナリー・ストリングにキャストする場合や、文字ストリングにサブタイプ FOR BIT DATA が設定されている場合は例外です。 その場合は、FOR BIT DATA の文字ストリングがバイナリー・ストリングと同じように扱われます。
実際の長さが 32673 バイト未満の BLOB ストリングは、基本述部 IN と BETWEEN や単純 CASE 式のオペランドとして使用できます。 LIKE 述部、NULL 述部、および POSSTR 関数を使用した比較では、任意の長さの BLOB ストリングが引き続きサポートされます。
- 文字ストリングとグラフィック・ストリングの比較
文字ストリングは、 データベースの作成時に指定された照合シーケンスに従って比較されます。 ただし、FOR BIT DATA 属性の文字ストリングは例外で、 そのような文字ストリングは常にビット値に従って比較されます。
長さの異なる文字ストリングを比較する場合、長い方のストリングの長さにあわせて、短い方のストリングの右端にブランクを埋め込んで延長した論理コピーを使用して比較が行われます。 この論理的な延長は、FOR BIT DATA のタグの付いたものも含め、すべての文字ストリングに対して行われます。
文字ストリング (FOR BIT DATA のタグが付けられた文字ストリングを除く) は、 データベースの作成時に指定された照合シーケンスに従って比較されます。 例えば、データベース・マネージャーによって指定されるデフォルトの照合シーケンスは、 同じ文字の小文字と大文字に同じ重みを与えています。 データベース・マネージャーは、完全に同一のストリングだけが互いに等しいと見なされるようにするため、2 つのパスからなる比較を実行します。 1 番目のパスでは、ストリングがデータベースの照合シーケンスに従って比較されます。 ストリングの文字の重みが等しい場合、2 番目の「決着を付ける」パスで、実際のコード・ポイント値に基づいてストリングが比較されます。
2 つのストリングは、両方が空であるか、または対応するすべてのバイトが等しい場合には、等しくなります。 どちらかのオペランドが NULL 値の場合の結果は不明です。
実際の長さが 32673 バイトより小さい LOB ストリングは、基本述部、IN、BETWEEN、および単純 CASE 式のオペランドとして現在サポートされています。 LIKE 述部、NULL 述部、および POSSTR 関数を使用した比較では、任意の長さの LOB ストリングが引き続きサポートされます。
LOB ストリングは、MAX、MIN、DISTINCT、GROUP BY、および ORDER BY などの他のすべての比較演算ではサポートされていません。
ストリングの一部は、SUBSTR および VARCHAR スカラー関数を使用して比較できます。 例えば、以下のような列を考えてみます。MY_SHORT_CLOB CLOB(300) MY_LONG_VAR VARCHAR(8000)
この場合、以下の演算は有効です。WHERE VARCHAR(MY_SHORT_CLOB) > VARCHAR(SUBSTR(MY_LONG_VAR,1,300))
次に例を示します。
以下の例で、'A'、'Á'、'a'、および 'á' のコード・ポイント値はそれぞれ、 X'41'、X'C1'、X'61'、および X'E1' です。
'A'、'Á'、'a'、'á' という文字の重みが 136、139、135、138 である照合シーケンスを考えてみます。 このような場合は以下のようになります。'a' < 'A' < 'á' < 'Á'
今度は D1、D2、D3、および D4 という 4 つの DBCS 文字を例にとって考えてみます。 これらの文字はそれぞれ 0xC141、0xC161、0xE141、 および 0xE161 というコード・ポイントを持っています。 これらの DBCS 文字が CHAR 列に入っている場合、 各文字のバイトが持っている照合重みに従った順序でソートされます。 第 1 バイトの重みは 138 と 139 であるため、D3 と D4 は D2 と D1 よりも前に来ます。第 2 バイトの重みは 135 と 136 であるため、 順序は以下のようになります。D4 < D3 < D2 < D1
ただし、比較する値に FOR BIT DATA 属性がある場合や、 これらの DBCS 文字が GRAPHIC 列に格納された場合は、照合重みは無視され、 これらの文字が持っているコード・ポイントに従って文字が比較されます。 以下のようになります。'A' < 'a' < 'Á' < 'á'
DBCS 文字は、バイトの並びとしてコード・ポイントの順序でソートされます。以下のようになります。D1 < D2 < D3 < D4
次に 'A'、Á'、'a'、'á' という文字が、 74、75、74、および 75 の (ユニークでない) 重みを持つ照合シーケンスを考えてみます。 照合重みだけに注目すると (第 1 のパス)、 'a' は 'A' に等しく、'á' は 'Á' に等しいですが、 文字のコード・ポイントを使用して同じ重みの文字が比較され (第 2 パス)、以下のようになります。'A' < 'a' < 'Á' < 'á'
CHAR 列に入っている DBCS 文字は、最初はバイトの並びが重みに従ってソートされます (第 1 パス)。それで等しいとみなされる場合は、コード・ポイントに従ってソートされます (第 2 パス)。 第 1 バイトは重みが同じであるため、コード・ポイント (0xC1 と 0xE1) で決着を付けることになります。 結果として、文字 D1 と D2 は文字 D3 と D4 の前にソートされます。 続いて、第 2 バイトも同じように比較されます。最終的な結果は以下のようになります。D1 < D2 < D3 < D4
ここでも、CHAR 列のデータに FOR BIT DATA 属性がある場合や、DBCS 文字が GRAPHIC 列に格納された場合は、照合重みは無視され、これらの文字が持っているコード・ポイントに従って文字が比較されます。 以下のようになります。D1 < D2 < D3 < D4
この特定の例では、照合重みが使用されたときと同じ結果になっていますが、当然ながら常にそうなるわけではありません。
比較の際の変換規則
2 つのストリングを比較する場合、必要なら、 一方のストリングがまずもう一方のストリングのコード化スキームおよびコード・ページに変換されます。
結果の順序付け
ソートを必要とする結果は、 ストリング比較で説明したストリング比較規則に基づいて順序付けされます。 比較はデータベース・サーバー側で実行されます。 クライアント・アプリケーションに結果が戻される時点で、 コード・ページ変換が実行されることがあります。 後から行われるこのようなコード・ページ変換は、 サーバーの決定した結果セットの順序には影響しません。
ストリング比較に関する MBCS の考慮事項
SBCS/MBCS 混合文字ストリングは、 データベースの作成時に指定された照合シーケンスに従って比較されます。 デフォルト (SYSTEM) 照合シーケンスを指定して作成されたデータベースの場合、1 バイトの ASCII 文字はすべて正しい順序にソートされますが、2 バイト文字は必ずしもコード・ポイントの順序になるとは限りません。 IDENTITY シーケンスを指定して作成されたデータベースの場合、2 バイト文字はすべてコード・ポイントの順序でソートされ、1 バイトの ASCII 文字も同様にコード・ポイントの順序で正しくソートされます。 COMPATIBILITY シーケンスを指定して作成されたデータベースの場合、ほとんどの 2 バイト文字について正しくソートを行い、ASCII についてもほぼ正しい、中間的な順序が使用されます。
混合文字ストリングはバイトごとに比較されます。 混合ストリング内に現われるマルチバイト文字では通常とは異なる結果になる場合がありますが、 これは個々のバイトが別々に扱われるためです。
以下に例を示します。
この例で、'A'、'B'、'a'、および 'b' の 2 バイト文字のコード・ポイント値はそれぞれ、X'8260'、X'8261'、X'8281'、および X'8282' です。
'B' < 'A' < 'a' < 'b'
および 'AB' < 'AA' < 'Aa' < 'Ab' < 'aB' < 'aA' < 'aa' < 'ab'
GRAPHIC ストリングの比較は、文字ストリングの場合と同じように処理されます。
GRAPHIC ストリングの比較は、DBCLOB を除くすべてのグラフィック・ストリング・データ・タイプの間で有効です。
GRAPHIC ストリングに対しては、データベースの照合シーケンスは使用されません。 その代わりに、GRAPHIC ストリングは、 常に対応するバイトの数値 (バイナリー値) に基づいて比較されます。
'A' < 'B' < 'a' < 'b'
および 'AA' < 'AB' < 'Aa' < 'Ab' < 'aA' < 'aB' < 'aa' < 'ab'
長さの異なるグラフィック・ストリングを比較する場合、短い方のストリングの論理コピーが、長い方のストリングの長さになるまで 2 バイト・ブランク文字を右に埋め込んで使用されます。
2 つのグラフィック・ストリングの値が等しくなるのは、両方が空であるか、 または対応するグラフィックがすべて等しい場合です。 どちらかのオペランドが NULL 値の場合の結果は不明です。 2 つの値が等しくない場合は、 両者の関係は単純なバイナリー・ストリング比較によって決定されます。
この節で説明してきたとおり、バイトごとのストリングの比較は誤った結果をもたらす場合があります。つまり、文字ごとの比較で得られるものとは異なる結果が生じる場合があります。 ここで示した一連の例は、同じ MBCS コード・ページであることを前提にしていますが、同じ言語を使用していても異なるマルチバイトのコード・ページが使用されると、状況がもっと複雑になる場合があります。 例えば、日本語 DBCS コード・ページと 日本語 EUC コード・ページからのストリングを比較するというような場合が考えられます。
日付/時刻の比較
日付、時刻、 またはタイム・スタンプ値は、同じデータ・タイプの別の値、同じデータ・タイプの日時定数、 または同じデータ・タイプの値のストリング表記と比較することができます。 また、 日付の値または日付のストリング表記を TIMESTAMP と比較することもできます。この場合、日付の値にない時刻情報はすべてゼロであるとみなされます。 すべての比較は日時順に行われます。 つまり、0001 年 1 月 1 日からの時間の経過の大きい方が値が大きいということです。 時刻 24:00:00 は、時刻 00:00:00 より大きいことになります。
時刻値と、時刻値のストリング表記とを扱う比較では、 常に秒数が組み入れられます。 ストリング表記で秒数を省略しているときは、暗黙のうちにゼロ秒が補われます。
- 精度が異なるタイム・スタンプ値を比較する場合、より高い精度を使用して比較が行われます。 秒の小数部分の足りない数字は、ゼロであると見なされます。
- タイム・スタンプ値と、タイム・スタンプ値のストリング表記とを比較する場合、まず、ストリング表記が TIMESTAMP(12) に変換されます。
- タイム・スタンプの比較は日時順に行われます。
等しいと見なしてよい表記については考慮されません。 したがって、以下の述部は真となります。
TIMESTAMP('1990-02-23-00.00.00') > '1990-02-22-24.00.00'
ユーザー定義タイプの比較
次のセクションには、ユーザー定義タイプが関係する比較に関する情報が記述されています。
厳密に型付けされた特殊タイプの比較
厳密に型付けされた特殊タイプの値は、完全に同一の厳密に型付けされた特殊タイプの値のみと比較できます。
CREATE TYPE YOUTH AS INTEGER
CREATE TABLE CAMP_DB_ROSTER
( NAME VARCHAR(20),
ATTENDEE_NUMBER INTEGER NOT NULL,
AGE YOUTH,
HIGH_SCHOOL_LEVEL YOUTH)
SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > HIGH_SCHOOL_LEVEL
SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > ATTENDEE_NUMBER
SELECT * FROM CAMP_DB_ROSTER
WHERE INTEGER(AGE) > ATTENDEE_NUMBER
SELECT * FROM CAMP_DB_ROSTER
WHERE CAST( AGE AS INTEGER) > ATTENDEE_NUMBER
SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > YOUTH(ATTENDEE_NUMBER)
SELECT * FROM CAMP_DB_ROSTER
WHERE AGE > CAST(ATTENDEE_NUMBER AS YOUTH)
緩やかに型付けされた特殊タイプの比較
緩やかに型付けされた特殊タイプの値は、この特殊タイプのソース・タイプの比較規則に従って比較されます。 データ・タイプ制約は、比較に影響を及ぼしません。 基礎となるソース・タイプを比較できる場合は、さまざまな緩やかに型付けされた特殊タイプの比較が有効になります。
構造化タイプの比較
ユーザー定義構造化タイプの値を、 他の値と比較することはできません (NULL 述部および TYPE 述部が使えます)。
配列タイプの比較
配列タイプ値の比較はサポートされていません。 配列のエレメントは、エレメントのデータ・タイプの比較規則に基づいて比較できます。
行タイプの比較
行変数は、行タイプ名が同じ場合でも、別の行変数と比較することはできません。 行タイプ内の個々のフィールドは他の値と比較でき、フィールドのデータ・タイプのための比較規則が適用されます。
カーソル・タイプの比較
カーソル変数は、カーソル・タイプ名が同じ場合でも、別のカーソル変数と比較することはできません。
ブール・タイプの比較
ブール値は、別のブール値と比較することも、ブール値にキャストできる値と比較することもできます。 TRUE の値は FALSE の値より大きくなります。
参照タイプの比較
参照タイプ値を比較できるのは、 それらのターゲット・タイプが共通のスーパータイプを持っている場合だけです。 共通のスーパータイプのスキーマ名が SQL パスに組み込まれている場合のみ、該当する比較関数が見つかります。 比較は参照タイプの表示タイプを使用して行われます。 参照の有効範囲は、比較では考慮されません。
非 Unicode データベースでの XML 比較
非 Unicode データベースで実行するとき、XML データと文字またはグラフィック・ストリングの値を比較するには、比較される 2 つのデータのセットのうちの 1 つのコード・ページ変換が必要です。 照会の述部として、あるいは文字またはグラフィック・ストリング・データ・タイプのホスト変数として、SQL または XQuery ステートメントで使用される文字またはグラフィックの値は、比較の前にデータベース・コード・ページに変換されます。 このデータに含まれている任意の文字が、データベース・コード・ページの一部ではないコード・ポイントを持っている場合、置換文字がその場所に追加され、予期しない照会の結果が生じる可能性があります。
例えば、UTF-8 コード・ページを持つクライアントが、ギリシャ語のエンコード ISO8859-7 で作成されたデータベース・サーバーに接続するのに使用されるとします。 式 ΣGΣM が、XQuery ステートメントの述部として送信されますが、ここで ΣG は Unicode のギリシャ語シグマ文字 (U+03A3) を表し、ΣM は Unicode の数学記号のシグマ (U+2211) を表します。 この式は最初にデータベース・コード・ページに変換され、その結果、両方の「Σ」文字はギリシャ語のデータベース・コード・ページにあるシグマのコード・ポイント 0xD3 に対応するように変換されます。 このコード・ポイントを ΣA としましょう。 新しく変換された式 ΣAΣA は、ターゲット XML データと比較するために、もう一度 UTF-8 に変換されます。 これら 2 つのコード・ポイントの違いは、述部式をデータベースに渡すのに必要なコード・ページ変換の結果として失われるので、最初の 2 つの異なる値 ΣG および ΣM は、式 ΣGΣG として XML パーサーに渡されます。 それで、この式は、XML 文書内の値 ΣGΣM と比較されたときに、一致しません。
コード・ページ変換の問題が原因で予期しない照会結果が発生する可能性を避ける 1 つの方法は、照会式に使用されているすべての文字に一致するコード・ポイントが必ずデータベース・コード・ページにあるようにすることです。 一致するコード・ポイントがない文字は、Unicode 文字のエンティティー参照を使用することによって、含めることができます。 文字のエンティティー参照は、常にコード・ページ変換をバイパスします。 例えば、ΣM 文字の代わりに文字のエンティティー参照 ࢣ を使用すると、データベース・コード・ページに関係なく、正しい Unicode コード・ポイントが比較に確実に使用されます。