SQL 解説書

連結演算子を使用する式

連結演算子 (CONCAT) は、2 つのストリング・オペランドを連結して、 1 つのストリング式 にします。

連結するオペランドは、互換性のあるストリングでなければなりません。 FOR BIT DATA として定義されている文字ストリングも含め、 2 進ストリングを文字ストリングと連結することはできません (SQLSTATE 42884)。 互換性の詳細については、 表 7 の互換性マトリックスを参照してください。

いずれかのオペランドがヌル値になる可能性がある場合は、 結果もヌル値になる可能性があり、いずれかがヌル値なら結果はヌル値になります。 そうでない場合、結果は第 1 オペランドの後に第 2 オペランドが続いた形式となります。 連結時に混合データが不正に形成されても、それに対する検査は行われません。

結果ストリングの長さは、オペランドの長さの合計になります。

結果のデータ・タイプと長さ属性は、以下の表に示すように、 オペランドのデータ・タイプと長さ属性によって決まります。

表 10. 連結するオペランドのデータ・タイプと長さ
オペランド 連結後の長さ属性 結果
CHAR(A) CHAR(B) <255 CHAR(A+B)
CHAR(A) CHAR(B) >254 VARCHAR(A+B)
CHAR(A) VARCHAR(B) <4001 VARCHAR(A+B)
CHAR(A) VARCHAR(B) >4000 LONG VARCHAR
CHAR(A) LONG VARCHAR - LONG VARCHAR



VARCHAR(A) VARCHAR(B) <4001 VARCHAR(A+B)
VARCHAR(A) VARCHAR(B) >4000 LONG VARCHAR
VARCHAR(A) LONG VARCHAR - LONG VARCHAR



LONG VARCHAR LONG VARCHAR - LONG VARCHAR



CLOB(A) CHAR(B) - CLOB(MIN(A+B, 2G))
CLOB(A) VARCHAR(B) - CLOB(MIN(A+B, 2G))
CLOB(A) LONG VARCHAR - CLOB(MIN(A+32K, 2G))
CLOB(A) CLOB(B) - CLOB(MIN(A+B, 2G))



GRAPHIC(A) GRAPHIC(B) <128 GRAPHIC(A+B)
GRAPHIC(A) GRAPHIC(B) >127 VARGRAPHIC(A+B)
GRAPHIC(A) VARGRAPHIC(B) <2001 VARGRAPHIC(A+B)
GRAPHIC(A) VARGRAPHIC(B) >2000 LONG VARGRAPHIC
GRAPHIC(A) LONG VARGRAPHIC - LONG VARGRAPHIC



VARGRAPHIC(A) VARGRAPHIC(B) <2001 VARGRAPHIC(A+B)
VARGRAPHIC(A) VARGRAPHIC(B) >2000 LONG VARGRAPHIC
VARGRAPHIC(A) LONG VARGRAPHIC - LONG VARGRAPHIC



LONG VARGRAPHIC LONG VARGRAPHIC - LONG VARGRAPHIC



DBCLOB(A) GRAPHIC(B) - DBCLOB(MIN(A+B, 1G))
DBCLOB(A) VARGRAPHIC(B) - DBCLOB(MIN(A+B, 1G))
DBCLOB(A) LONG VARGRAPHIC - DBCLOB(MIN(A+16K, 1G))
DBCLOB(A) DBCLOB(B) - DBCLOB(MIN(A+B, 1G))



BLOB(A) BLOB(B) - BLOB(MIN(A+B, 2G))

直前のバージョンとの互換性を保つために、 LONG データ・タイプを含む結果を LOB データ・タイプに自動調整しないことに注意してください。 たとえば、CHAR(200) の値と、完全に文字の詰まった LONG VARCHAR の値とを連結した場合、 CLOB データ・タイプへプロモートされるのではなくエラーになります。

結果のコード・ページは派生コード・ページとみなされ、 ストリング変換に関する規則で説明されているようにして、 そのオペランドのコード・ページによって決定されます。

一方のオペランドはパラメーター・マーカーにすることができます。 パラメーター・マーカーが使用されている場合、 そのオペランドのデータ・タイプと長さ属性は、 パラメーター・マーカーでないオペランドと同じであるとみなされます。 ネストした連結の場合、 これらの属性を決定できるように演算の順序を考慮する必要があります。

例 1: FIRSTNME が Pierre で LASTNAME が Fermat である場合、 以下のようになります。

FIRSTNME CONCAT ' ' CONCAT LASTNAME

Pierre Fermat の値が戻されます。

例 2: 以下を条件とします。

この場合、 COLA CONCAT :host_var CONCAT COLC CONCAT COLD の値は次のとおりです。

'AABB CC DDDDD'

データ・タイプが VARCHAR で、長さ属性は 17、 結果コード・ページはデータベース・コード・ページとなります。

例 3: 以下を条件とします。

COLA は、CHAR(10) として定義されている。
COLB は、VARCHAR(5) として定義されている。

次の式の中のパラメーター・マーカーは、

   COLA CONCAT COLB CONCAT ?

VARCHAR(15) とみなされます。 これは、COLA CONCAT COLB が最初に評価され、 その結果が 2 番目の CONCAT 演算の第 1 オペランドとなるためです。

ユーザー定義タイプ

ユーザー定義タイプは、ストリング・タイプのソース・データ・タイプがある特殊タイプであっても、 連結演算子は使用できません。

連結するためには、そのソースとしての CONCAT 演算子を使った関数を作成する必要があります。 たとえば、TITLE と TITLE_DESCRIPTION という特殊タイプがあり、 どちらも VARCHAR(25) データ・タイプである場合は、 以下に示すユーザー定義関数 ATTACH でそれらを連結することができます。

   CREATE FUNCTION ATTACH (TITLE, TITLE_DESCRIPTION)
     RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())

別の方法として、新規のデータ・タイプを追加するユーザー定義関数を使用し、 連結演算子を多重定義することもできます。

   CREATE FUNCTION CONCAT (TITLE, TITLE_DESCRIPTION)
     RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())

算術演算子を使用する式

算術演算子が使用されている場合、式の結果は、 演算子をオペランドの値に適用して導かれた値となります。

いずれかのオペランドがヌル値になる可能性がある場合、 またはデータベースが DFT_SQLMATHWARN を yes に設定して構成されている場合、 結果もヌル値になる可能性があります。

どちらか一方のオペランドがヌル値ならば、式の結果はヌル値になります。

算術演算子は、符号付き数値タイプと日時タイプに適用できます (SQL における日付 / 時刻の算術演算を参照)。 たとえば、USER+2 は無効です。 ソース関数については、 符号付き数値タイプであるソース・タイプを持つ特殊タイプ上の算術演算子に定義できます。

接頭演算子、+ (単項加算) はそのオペランドを変更しません。

接頭演算子、- (単項減算) は、ゼロ以外のオペランドの符号を逆にします。 A のデータ・タイプが短精度整数である場合、 -A のデータ・タイプは長精度整数になります。

接頭演算子の後に続くトークンの先頭の文字は、正または負の符号であってはなりません。

挿入演算子 +、-、*、および / はそれぞれ、 加算、減算、乗算、および除算を指定します。

除算の第 2 オペランドの値はゼロにすることはできません。 これらの演算子は関数としても扱われます。 したがって、式 "+"(a,b) は、 式 a+b の"演算子"の機能と同じ意味になります。

算術演算エラー

ゼロによる除算や数値の桁あふれなどの算術演算エラーが、式の処理の過程で生じると、 エラーが戻され、その式を処理する SQL ステートメントは失敗し、 エラー (SQLSTATE 22003 または 22012) が出されます。

データベースは、算術演算エラーが生じた場合に 式の値としてヌル値を戻すように構成することが可能で (DFT_SQLMATHWARN を yes に設定して)、 警告 (SQLSTATE 01519 または 01564) を出して、 その SQL ステートメントの処理を続けることができます。 算術計算エラーがヌル値として扱われる場合、SQL ステートメントの結果に影響があります。 以下は、このような影響の例を示しています。

このようなタイプの影響が受け入れられない場合、 算術演算エラーを処理するのに必要な他の処置を行って、 受け入れ可能な結果を生成する必要があります。 たとえば次のような処置です。

2 つの整数オペランド

算術演算子のオペランドが両方とも整数の場合、その演算は 2 進数で実行され、 いずれかの (または両方の) オペランドが大整数 (big integer) でない限り、 その結果は長精度整数 (large integer) になります。 いずれかの (または両方の) オペランドが大整数である場合は、結果は大整数になります。 除算の剰余は失われます。 整数算術演算 (単項減算符号を含む) の結果は、結果タイプの範囲内でなければなりません。

整数と 10 進数オペランド

一方のオペランドが整数で、もう一方のオペランドが 10 進数の場合、その演算は、 精度 p および位取り 0 の 10 進数に変換されたその整数の一時コピーを使用して、 10 進数で行われます。 p は、大整数 (big integer) の場合 19 であり、 長精度整数 (large integer) の場合 11 であり、 短精度整数 (small integer) の場合 5 です。

2 つの 10 進数オペランド

オペランドが両方とも 10 進数の場合、その演算は 10 進数で行われます。 10 進数の算術演算の結果は 10 進数であり、その結果の精度と位取りは、 演算の種類およびオペランドの精度と位取りによって異なります。

演算が加算または減算で、オペランドの位取りが同じでない場合は、 オペランドの一方の一時コピーを使用して演算が行われます。 短い方のオペランドの小数部分が、長い方のオペランドと同じ桁数になるように、 短い方のオペランドのコピーに後続ゼロを加えて拡張されます。

10 進数演算の結果は、精度が 31 以下でなければなりません。 10 進数の加算、減算、および乗算の結果は、 精度が 31 を超える一時結果から求められることがあります。 一時結果の精度が 31 を超えない場合、最終結果は一時結果と同じです。

SQL での 10 進数演算

以下の公式により、SQL における 10 進数演算の結果の精度および位取りが決まります。

記号 ps は第 1 オペランドの精度と位取りを表し、 記号 p' と s' は第 2 オペランドの精度と位取りを表します。

加算および減算

精度は min(31,max(p-s,p'-s') +max(s,s')+1) になります。 位取りは max(s,s') です。

乗算

乗算結果の精度は (31,p+p')、 位取りは min(31,s+s') です。

除算

除算結果の精度は 31 です。 位取りは 31-p+s-s' です。 位取りは負であってはなりません。

浮動小数点オペランド

算術演算子のいずれかのオペランドが浮動小数点の場合、演算は浮動小数点で行われ、 必要に応じてオペランドが最初に倍精度の浮動小数点数に変換されます。 したがって、式の要素のいずれかが浮動小数点数の場合、 その式の結果は倍精度浮動小数点数になります。

浮動小数点数と整数を含む演算は、 整数を倍精度浮動小数点に変換したものの一時コピーを使って実行されます。 浮動小数点数と 10 進数を含む演算は、 10 進数を倍精度浮動小数点に変換したものの一時コピーを使って実行されます。 浮動小数点数演算の結果は、浮動小数点数の範囲内でなければなりません。

オペランドとしてのユーザー定義タイプ

ユーザー定義タイプは、 そのソース・データ・タイプが数値であっても算術演算子には使用できません。

算術演算を実行するには、 そのソースとしての算術演算子を使用する関数を作成する必要があります。 たとえば、INCOME と EXPENSES という特殊タイプがあり、 どちらも DECIMAL(8,2) データ・タイプである場合は、 以下に示すユーザー定義関数 REVENUE を使って一方からもう一方を減算することができます。

   CREATE FUNCTION REVENUE (INCOME, EXPENSES)
     RETURNS DECIMAL(8,2) SOURCE "-" (DECIMAL, DECIMAL)

別の方法として、 新規のデータ・タイプを減算するユーザー定義関数を使って - (マイナス) 演算子を多重定義することも可能です。

   CREATE FUNCTION "-" (INCOME, EXPENSES)
     RETURNS DECIMAL(8,2) SOURCE "-" (DECIMAL, DECIMAL)

スカラー全選択

式でサポートされる scalar fullselect (スカラー全選択) は、 括弧で囲まれる全選択であり、1 つの列値で構成される 1 つの行を戻します。 全選択が行を戻さない場合、式の結果はヌル値になります。 選択リスト要素が単なる列名か別の演算の式である場合、 その列の名前に基づいて結果列の名前が付けられます。 詳細については、全選択を参照してください。

日付 / 時刻演算と期間

日付 / 時刻の値は、増分、減分、および減算を行うことができます。 このような演算には、期間 と呼ばれる 10 進数を伴う場合があります。 期間の定義と、日付 / 時刻の算術演算に関する規則の仕様について以下に説明します。

期間とは、時間の間隔を表す数値です。 期間には以下の 4 つのタイプがあります。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]