式は値を指定します。 これは、定数や列名のみで構成される簡単な値にすることも、もっと複雑な値にすることも可能です。 類似した複雑な式を繰り返し使用する場合は、SQL 関数を使用して共通の式をカプセル化することを検討してください。

許可

スカラー副選択、シーケンス参照、関数呼び出しなどの、一部の式を使用する場合に、特別な許可が必要になることがあります。 これらの式を使用するには、許可 ID によって保持されている特権に、以下の特権が少なくとも 1 つ含まれている必要があります。
scalar-subselect
権限に関する考慮事項については、『SQL 照会』を参照してください。
sequence-reference
シーケンスを参照するための権限。 権限に関する考慮事項については、『シーケンス権限』を参照してください。
function-invocation
ユーザー定義関数を実行する権限。 権限に関する考慮事項については、『関数』『関数呼び出し』 セクションを参照してください。
variable
グローバル変数の場合は、グローバル変数を参照するための許可が必須です。 情報については、グローバル変数を参照してください。

Unicode データベースでは、文字ストリングまたはグラフィック・ストリングを受け入れる式は、 変換をサポートされている任意のストリング・タイプを受け入れます。

expression
Read syntax diagramSkip visual syntax diagramoperator ~  +  - function-invocation1(expression)constant2column-namevariable3special-register4scalar-fullselect5labeled-duration6case-expression7cast-specification8field-reference9xmlcast-specification10array-element-specification11array-constructor12dereference-operation13method-invocation14OLAP-specification15row-change-expression16sequence-reference17subtype-treatment18search-condition19
operator
Read syntax diagramSkip visual syntax diagram **  *  /  %  CONCAT  || 20 +  -  &  |  ^
Notes:

演算子がない式

演算子を使用しない式では、指定した値が式の結果になります。 以下に例を示します。

   SALARY:SALARY'SALARY'MAX(SALARY)

連結演算子がある式

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

第 1 オペランドは、ストリング・データ・タイプ、数値データ・タイプ、または日時データ・タイプの値を返す式です。 第 2 オペランドも、ストリング・データ・タイプ、数値データ・タイプ、または日時データ・タイプの値を返す式です。 ただし、このセクションで後述するように、 データ・タイプによっては、第 1 オペランドのデータ・タイプと組み合わせることがサポートされていないものもあります。

各オペランドには、以下のいずれかのタイプを使用できます。
  • ストリング (バイナリー・ストリングを除く)
  • 数値 (暗黙的に VARCHAR にキャストされます)
  • 日付/時刻 (暗黙的に VARCHAR にキャストされます)
  • ブール (暗黙的に VARCHAR にキャストされます)
しかし、バイナリー・ストリングは、別のバイナリー・ストリングと、あるいは FOR BIT DATA として定義された文字ストリングとのみ連結できます。

文字ストリング・オペランドとグラフィック・ストリング・オペランドの両方がかかわる連結は、Unicode データベースでのみサポートされます。 文字オペランドは、連結の前にまず GRAPHIC データ・タイプに変換されます。 FOR BIT DATA として定義されている文字ストリングは、GRAPHIC データ・タイプにキャストできません。

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

結果ストリングの長さは、オペランドの長さの合計になります。 Unicode データベースでは、結果のストリング単位は「結果データ・タイプの規則」で説明しているように、オペランドの最大ストリング単位です。

結果のデータ・タイプと長さ属性は、以下の表に示すように、オペランドのデータ・タイプと長さ属性によって決まります。 ただし、オペランドが CODEUNITS32 で定義されている場合を除きます。

表 1. CODEUNITS32 以外の連結されたオペランドのデータ・タイプと長さ
オペランド 連結後の長さ属性1 結果
CHAR(A) CHAR(B) <256 CHAR(A+B)
CHAR(A) CHAR(B) >255 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, 2147483647))
CLOB(A) VARCHAR(B) - CLOB(MIN(A+B, 2147483647))
CLOB(A) LONG VARCHAR - CLOB(MIN(A+32700, 2147483647))
CLOB(A) CLOB(B) - CLOB(MIN(A+B, 2147483647))
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, 1073741823))
DBCLOB(A) VARGRAPHIC(B) - DBCLOB(MIN(A+B, 1073741823))
DBCLOB(A) LONG VARGRAPHIC - DBCLOB(MIN(A+16350, 1073741823))
DBCLOB(A) DBCLOB(B) - DBCLOB(MIN(A+B, 1073741823))
BINARY(A) BINARY(B) <256 BINARY(A+B)
BINARY(A) CHAR(B) FOR BIT DATA <256 BINARY(A+B)
BINARY(A) BINARY(B) >255 VARBINARY(A+B)
BINARY(A) CHAR(B) FOR BIT DATA >255 VARBINARY(A+B)
BINARY(A) VARBINARY(B) - VARBINARY(MIN(A+B, 32672))
BINARY(A) VARCHAR(B) FOR BIT DATA - VARBINARY(MIN(A+B, 32672))
VARBINARY(A) VARBINARY(B) - VARBINARY(MIN(A+B, 32672))
VARBINARY(A) CHAR(B) FOR BIT DATA - VARBINARY(MIN(A+B, 32672))
VARBINARY(A) VARCHAR(B) FOR BIT DATA - VARBINARY(MIN(A+B, 32672))
BLOB(A) BINARY(B) - BLOB(MIN(A+B, 2147483647))
BLOB(A) CHAR(B) FOR BIT DATA - BLOB(MIN(A+B, 2147483647))
BLOB(A) VARBINARY(B) - BLOB(MIN(A+B, 2147483647))
BLOB(A) VARCHAR(B) FOR BIT DATA - BLOB(MIN(A+B, 2147483647))
BLOB(A) BLOB(B) - BLOB(MIN(A+B, 2147483647))
注記

1 「連結後の長さ属性」に指定された数値は、文字ストリングの場合 OCTETS、GRAPHIC ストリングの場合 CODEUNITS16 でリストされています。 オペランドが CODEUNITS32 で定義されている場合、次の表を参照してください。

CODEUNITS32 でオペランドを定義した場合は、もう一方のオペランドを FOR BIT DATA として定義することはできません。 そうでない場合、オペランドが CODEUNITS32 で定義されると、結果のデータ・タイプと長さ属性は、以下の表に示すように、 オペランドのデータ・タイプと長さ属性によって決まります。

表 2. CODEUNITS32 で連結されたオペランドのデータ・タイプと長さ
オペランド 連結後の長さ属性 結果
CHAR(A) CHAR(B) <64 CHAR(A+B)
CHAR(A) CHAR(B) >63 VARCHAR(A+B)
CHAR(A) VARCHAR(B) - VARCHAR(MIN(A+B, 8168))
VARCHAR(A) VARCHAR(B) - VARCHAR(MIN(A+B, 8168))
CLOB(A) CHAR(B) - CLOB(MIN(A+B, 536870911))
CLOB(A) VARCHAR(B - CLOB(MIN(A+B, 536870911))
CLOB(A) CLOB(B) - CLOB(MIN(A+B, 536870911))
GRAPHIC(A) GRAPHIC(B) <64 GRAPHIC(A+B)
GRAPHIC(A) GRAPHIC(B) >63 VARGRAPHIC(A+B)
GRAPHIC(A) VARGRAPHIC(B) - VARGRAPHIC(MIN(A+B, 8168))
VARGRAPHIC(A) VARGRAPHIC(B) - VARGRAPHIC(MIN(A+B, 8168))
DBCLOB(A) CHAR(B) - DBCLOB(MIN(A+B, 536870911))
DBCLOB(A) VARCHAR(B) - DBCLOB(MIN(A+B, 536870911))
DBCLOB(A) DBCLOB(B) - DBCLOB(MIN(A+B, 536870911))

以前のバージョンまたは他のデータベース製品との互換性のために、LONG VARCHAR または LONG VARGRAPHIC データ・タイプを含む結果が LOB データ・タイプに自動的にエスカレートされることはありません。 例えば、CHAR(200) の値と、完全に文字の詰まった LONG VARCHAR の値とを連結した場合、 CLOB データ・タイプへプロモートされるのではなくエラーになります。

結果のコード・ページは派生コード・ページと見なされ、 そのオペランドのコード・ページによって決定されます。 詳しくは、 ストリング変換の規則を参照してください。

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

例 1: FIRSTNME が Pierre で LASTNAME が Fermat である場合、 以下のようになります。
   FIRSTNME CONCAT ' ' CONCAT LASTNAME
Pierre Fermat の値が戻されます。
例 2: 次のように指定します。
  • COLA が VARCHAR(5) と定義されていて、そこに値 'AA' が挿入されている。
  • 文字ホスト変数 :host_var に、長さ 5 と値 'BB   ' が定義されている。
  • COLC が CHAR (5) と定義されていて、そこに値 'CC' が挿入されている。
  • COLD が CHAR (5) と定義されていて、そこに値 'DDDDD' が挿入されている。
COLA CONCAT :host_var CONCAT COLC CONCAT COLD の値は 'AABB   CC   DDDDD' です。

結果のデータ・タイプは VARCHAR であり、その長さ属性は 2+5+5+5=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())

算術演算子がある式

式で算術演算子を使用した場合、式の結果は、演算子をオペランドの値に適用して得られた値になります。 これらの演算子は、中置表記法または接頭表記法のどちらかを使用して指定できます。 例えば、a+b ステートメントと "+"(a,b) ステートメントは同等です。

算術式の中のいずれかのオペランドが NULL になる可能性がある場合、またはデータベースの構成で dft_sqlmathwarnyes に設定されている場合は、結果が NULL になる可能性があります。 算術式のいずれかのオペランドが NULL 値の場合、その式の結果は NULL 値になります。

算術演算子は、符号付き数値タイプおよび日時タイプに適用できます ( SQL での日時算術計算を参照)。 例えば、USER+2 は無効です。 算術演算のいずれかのオペランドが緩やかに型付けされた特殊タイプである場合、操作ではオペランドのデータ・タイプを、緩やかに型付けされた特殊タイプのソース・タイプと見なして実行します。 ソース関数については、符号付き数値タイプであるソース・タイプを持つ厳密に型付けされた特殊タイプ上の算術演算子に定義できます。

単項加算 (+) 接頭演算子は、そのオペランドを変更しません。 単項減算 (-) 接頭演算子は、以下の符号を反転させます。
  • 非ゼロ非 10 進浮動小数点オペランド
  • 10 進浮動小数点オペランド (0、-0、静止 NaN、シグナリング NaN、+infinity、および -infinity を含む)
x のデータ・タイプが短精度整数である場合、-x のデータ・タイプは長精度整数になります。 接頭演算子の後に続くトークンの先頭文字が、プラス (+) 記号またはマイナス (-) 記号であってはなりません。
表 3. 2 項算術演算子
算術演算子 名前 説明
+ 加算 結果は、最初の引数と 2 番目の引数の合計です。
- 減算 結果は、最初の引数から 2 番目の引数を引いた値です。
* 乗算 結果は、最初の引数に 2 番目の引数を掛けた値です。
/ 除算 結果は、最初の引数を 2 番目の引数で割った値です。 第 2 オペランドの値がゼロであってはなりません。ただし、10 進浮動小数点演算を使用して計算が行われる場合を除きます。
% モジュロ 結果は、最初の引数を 2 番目の引数で割った余りです。
** 指数 結果は、最初の引数を 2 番目の引数で累乗した値です。 結果のデータ・タイプは、以下のようになります。
  • 両方の引数が INTEGER タイプまたは SMALLINT タイプの場合は INTEGER。
  • 一方の引数が BIGINT タイプで、もう一方の引数が BIGINT、INTEGER または SMALLINT タイプの場合は BIGINT。
  • どちらかまたは両方の引数がタイプ DECFLOAT の場合は DECFLOAT(34)。ただし、以下の記述のいずれかに該当する場合を除きます。その場合、結果はタイプ NAN で、無効演算条件になります。
    • 両方の引数がゼロである。
    • 2 番目の引数に、ゼロ以外の小数部分がある。
    • 2 番目の引数が 9 桁を超えている。
    • 2 番目の引数が INFINITY である。
  • それ以外の場合は DOUBLE になります。

算術演算が行われる前に、LOB 以外のストリングであるオペランドは、CAST 指定の規則を使用して DECFLOAT(34) に変換されます。 詳しくは、 データ・タイプ間のキャストを参照してください。 グラフィック・ストリングのオペランドを含む算術演算は、Unicode データベースの場合のみ実行できます。

算術演算エラー

ゼロ除算や数値のオーバーフローなどの算術演算エラーが、非 10 進浮動小数点式の処理の過程で生じると、エラー (SQLSTATE 22003 または 22012) が戻されます。 10 進浮動小数点式の場合は、警告 (算術計算条件の性質によって SQLSTATE 0168C、0168D、0168E、または 0168F のいずれか) が戻されます。

データベースは、非 10 進浮動小数点式で算術演算エラーが生じた場合に NULL 値を戻すように構成することが可能で (dft_sqlmathwarn を YES に設定して)、照会は警告 (SQLSTATE 01519 または 01564) を戻して、その SQL ステートメントの処理を続けます。

10 進浮動小数点式の場合、dft_sqlmathwarn の設定の効果はありません。算術計算条件は適切な値 (おそらく 10 進浮動小数点特殊値) を戻し、照会は警告 (SQLSTATE 0168C、0168D、0168E、または 0168F) を戻して、その SQL ステートメントの処理を続けます。 戻される特殊値には、正と負の無限大および Not a Number が含まれます。 1 つ以上の 10 進浮動小数点数を含む算術式は、式の 1 つ以上の引数が NULL でない限り、結果が NULL 値になることはありません。

算術計算エラーが NULL 値として扱われる場合、SQL ステートメントの結果に影響があります。 以下は、このような影響の例を示しています。

  • 集約関数の引数の式で算術演算エラーが起きると、 その集約関数の結果を判別する際に行が無視されます。 算術演算エラーがオーバーフローである場合、 結果の値に大きな影響を与える場合があります。
  • WHERE 節の述部の式で算術演算エラーが起きると、 結果に行が入っていない場合があります。
  • チェック制約の述部の式で算術演算エラーが起きても、 制約には誤りがないため更新または挿入は続行されます。
このようなタイプの影響が受け入れられない場合、 算術演算エラーを処理するのに必要な他の処置を行って、 受け入れ可能な結果を生成する必要があります。 次に例を示します。
  • ゼロ除算の有無を検査するために CASE 式を追加して、このような状態に対応する必要な値を設定する。
  • NULL 値を処理する述部を追加する (NULL 可能でない列のチェック制約は次のようになります)。
       check (c1*c2 is not null and c1*c2>5000)
    (これにより、オーバーフローの制約に違反する場合があります。)

2 つの整数オペランド

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

整数と 10 進数オペランド

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

2 つの 10 進数オペランド

オペランドが両方とも 10 進数の場合、その演算は 10 進数で行われます。 10 進数の算術演算の結果は 10 進数であり、その結果の精度と位取りは、 演算の種類およびオペランドの精度と位取りによって異なります。 演算が加算または減算で、オペランドの位取りが同じでない場合は、 オペランドの一方の一時コピーを使用して演算が行われます。 短い方のオペランドの小数部分が、長い方のオペランドと同じ桁数になるように、 短い方のオペランドのコピーに後続ゼロを加えて拡張されます。

10 進演算の結果は、精度が 31 より大きくなることはありません。 10 進数の加算、減算、および乗算の結果は一時的な結果を基に算出されますが、その一時的な結果の精度は 31 より大きくなる場合があります。 一時結果の精度が 31 を超えない場合、最終結果は一時結果と同じです。

SQL での 10 進数演算

SQL における 10 進演算の結果の精度および位取りを計算する場合は、ここに示す式を使用してください。 これらの式では、以下の記号を使用しています。
p
第 1 オペランドの精度。
s
第 1 オペランドの位取り。
p'
第 2 オペランドの精度。
s'
第 2 オペランドの位取り。
Addition and subtraction
結果の位取りは MAX(s,s') になります。 DEC15 モードが有効で、p<15 および p'<15 である場合、精度は MIN(15,MAX(p-s,p'-s')+MAX(s,s')+1) になります。 それ以外の場合の精度は MIN(31,MAX(p-s,p'-s')+MAX(s,s')+1) になります。
Multiplication
DEC15 モードが有効で、p<15 および p'<15 である場合、精度は MIN(15,p+p')、位取りは MIN(15,s+s') になります。 それ以外の場合、精度は MIN(31,p+p')、位取りは MIN(31,s+s') になります。
Division
以下の表に、さまざまな要素に応じた結果の精度および位取りを示します。
表 4. 小数除算の結果の精度および位取り
DECIMAL 算術モード1 p P ' 結果の精度 結果の位取り
デフォルト 該当なし 該当なし 31 31-p+s-s'
DEC15 <=15 <=15 15 15-(p-s+s')
DEC15 >15 <=15 31 N-(p-s+s')、ここで:
  • 30-p' if p' が奇数の場合、N
  • 29-p' if p' が偶数の場合、N
DEC31 該当なし <=15 31 N-(p-s+s')、ここで:
  • 30-p' if p' が奇数の場合、N
  • 29-p' if p' が偶数の場合、N
DEC15 または DEC31 該当なし >15 31 15-(p-s+MAX(0,s'-(p'-15)))
注:
  1. これらのモードは、dec_arithmetic 構成パラメーターによって決定されます。

最小 DECIMAL 除算位取り S が有効な場合、位取りは S の最小値と 表 4から得られる位取りになります。 また、負の位取りはエラーになります (SQLSTATE 42911)。

Exponential
結果タイプは DOUBLE です。

浮動小数点オペランド

算術演算子のいずれかのオペランドが浮動小数点数であるものの、10 進浮動小数点数ではない場合、演算は浮動小数点数で実行されます。 オペランドは、必要に応じて、まず倍精度浮動小数点数に変換されます。 したがって、式のエレメントのいずれかが浮動小数点数の場合、 その式の結果は倍精度浮動小数点数になります。

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

浮動小数点数オペランドは実数の近似表現であるため、浮動小数点数オペランド (または関数の引数) が処理される順序が結果に多少影響する場合があります。 オペランドが処理される順序がオプティマイザーによって暗黙的に変更される可能性があるため (例えば、使用する並列処理の度合いや、使用するアクセス・プランをオプティマイザーが決定する場合があります)、アプリケーションで浮動小数点数オペランドを使用する場合、SQL ステートメントが実行される度に毎回結果が厳密に同一であると期待すべきではありません。

10 進浮動小数点数オペランド

算術演算子のいずれかのオペランドが 10 進浮動小数点数の場合、その演算は 10 進浮動小数点数で実行されます。
Integer and decimal floating-point operands
一方のオペランドが短精度整数または長精度整数で、他方のオペランドが DECFLOAT(n) の数値である場合、演算は DECFLOAT(n) で実行されます。その際、DECFLOAT(n) の数値に変換された整数の一時コピーが使用されます。 一方のオペランドが 64 ビット整数 (big integer) で、他方のオペランドが 10 進浮動小数点数である場合には、64 ビット整数の一時コピーが DECFLOAT(34) の数値に変換されます。 そして、2 つの 10 進浮動小数点数オペランドについての規則が適用されます。
Decimal and decimal floating-point operands
一方のオペランドが 10 進数で、他方のオペランドが 10 進浮動小数点数である場合、演算は 10 進浮動小数点数で実行されます。その際、10 進数の精度に基づいて 10 進浮動小数点数に変換された 10 進数の一時コピーが使用されます。 10 進数の精度が 17 より小さい場合、10 進数は DECFLOAT(16) の数値に変換されます。 それ以外の場合、10 進数は DECFLOAT(34) の数値に変換されます。 そして、2 つの 10 進浮動小数点数オペランドについての規則が適用されます。
Floating-point and decimal floating-point operands
一方のオペランドが浮動小数点数 (REAL または DOUBLE) で、他方のオペランドが DECFLOAT(n) の数値である場合、演算は 10 進浮動小数点数で実行されます。その際、DECFLOAT(n) の数値に変換された浮動小数点数の一時コピーが使用されます。
Two decimal floating-point operands
オペランドが両方とも DECFLOAT(n) である場合、演算は DECFLOAT(n) で実行されます。 一方のオペランドが DECFLOAT(16) で、他方のオペランドが DECFLOAT(34) である場合、演算は DECFLOAT(34) で実行されます。

10 進浮動小数点数のための一般算術演算規則

以下の一般的な規則が、10 進浮動小数点データ・タイプでのすべての算術演算に適用されます。
  • 有限数ではどの演算も、係数について整数算術計算を可能な限り使用して、正確な計算結果が算出されるかのように実行されます。

    理論上正確な結果の係数が、精度を反映する桁数 (16 または 34) 以下である場合は、変更なく、それが結果に使用されます (アンダーフローまたはオーバーフロー条件が起きない限り)。 係数の桁数が精度を反映する桁数を上回る場合には、その精度を反映するちょうどの桁数 (16 または 34) に丸められて、取り除かれた桁数分だけ指数が増やされます。

    CURRENT DECFLOAT ROUNDING MODE 特殊レジスターは、丸めモードを決定します。

    調整された結果の指数の値が Emin よりも小さい場合は、算出された係数と指数が結果を形成します。ただし、指数の値が Etiny よりも小さい場合は例外です。 その場合は指数が Etiny に設定され、係数は指数の調整に一致するように (おそらくゼロに) 丸められて、符号は変わりません。 この丸めによって不正確な結果になる場合は、アンダーフロー例外条件が戻されます。

    調整された結果の指数の値が Emax よりも大きい場合は、オーバーフロー例外条件が戻されます。 この場合、結果はオーバーフロー例外条件として定義され、無限大になる可能性があります。 それは理論上の結果と同じ符号を持ちます。

  • 特殊値の無限大を使用する算術計算は、通常の規則に従います。ここで、負の無限大はすべての有限数よりも小さく、正の無限大はすべての有限数よりも大きくなります。 こうした規則のもとでは、無限大の結果は常に正確です。 無限大のある種の使用は、無効な演算条件を戻します。 以下のリストは、無効な演算条件が生じる可能性のある演算を示しています。 このような演算の結果は、一方のオペランドが無限大で、もう一方のオペランドが NaN (静止またはシグナリング) でなければ、NaN になります。
    • 加算または減算演算中に +infinity を -infinity に加算する
    • 0 に +infinity または -infinity を乗算する
    • +infinity または -infinity のいずれかを +infinity または -infinity のいずれかで除算する
    • QUANTIZE 関数のいずれかの引数が +infinity または -infinity である
    • POWER 関数の 2 番目の引数が +infinity または -infinity である
    • シグナリング NaN が算術演算のオペランドである
    以下の規則が算術演算および NaN 値に適用されます。
    • NaN (静止またはシグナリング) オペランドを持つすべての算術演算の結果は NaN になります。 結果の符号は、シグナリング NaN である最初のオペランドからコピーされます。 どちらのオペランドもシグナリングでない場合は、NaN である最初のオペランドからコピーされます。 結果が NaN であるときはいつでも、結果の符号はコピーされたオペランドだけによって決まります。
    • 乗算または除算演算の結果の符号が負になるのは、2 つのオペランドの符号が異なっていて、どちらも NaN でない場合だけです。
    • 加算または減算演算の結果の符号が負になるのは、結果がゼロより小さく、どちらのオペランドも NaN でない場合だけです。ただし、以下のケースでは、結果が -0 になります。
      • 結果が 0 に丸められ、丸められる前の値が負符号を持っていた
      • 0 が -0 から減算された
      • 反対の符号を持つオペランドが加算され、あるいは同じ符号を持つオペランドが減算された結果として、係数が 0 になり、丸めモードが ROUND_FLOOR である
      • オペランドが乗算または除算された結果として係数が 0 になり、2 つのオペランドの符号が異なっている
      • POWER 関数の第 1 引数が -0 で、第 2 引数が正の奇数である
      • CEIL、FLOOR、または SQRT 関数の引数が -0 である
      • ROUND または TRUNCATE 関数の第 1 引数が -0 である
以下の例は、オペランドとしての特殊 10 進浮動小数点値を示しています。
   INFINITY + 1          = INFINITY
   INFINITY + INFINITY   = INFINITY
   INFINITY + -INFINITY  = NAN         -- warning
   NAN + 1               = NAN
   NAN + INFINITY        = NAN
   1 - INFINITY          = -INFINITY
   INFINITY - INFINITY   = NAN         -- warning
   -INFINITY - -INFINITY = NAN         -- warning
   -0.0 - 0.0E1          = -0.0
   -1.0 * 0.0E1          = -0.0
   1.0E1 / 0             = INFINITY    -- warning
   -1.0E5 / 0.0          = -INFINITY   -- warning
   1.0E5 / -0            = -INFINITY   -- warning
   INFINITY / -INFINITY  = NAN         -- warning
   INFINITY / 0          = INFINITY
   -INFINITY / 0         = -INFINITY
   -INFINITY / -0        = INFINITY

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

緩やかに型付けされた特殊タイプのソース・タイプが算術演算子によってサポートされている場合、緩やかに型付けされたその特殊タイプのオペランドを算術演算子と一緒に使用できます。 緩やかに型付けされた特殊タイプのオペランドの算術演算をサポートするために、追加のユーザー定義関数を作成する必要はありません。

厳密に型付けされたユーザー定義タイプは、そのソース・データ・タイプが数値であっても算術演算子には使用できません。 算術演算を実行するには、 そのソースとしての算術演算子を使用する関数を作成する必要があります。 例えば、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)

ビット単位演算がある式

ビット単位演算子 BITAND (&)、BITOR (|)、BITXOR (^)、および BITNOT (~) は、 BITAND、BITANDNOT、BITOR、BITXOR、および BITNOT スカラー関数で説明されている類似の名前付きスカラー関数に対応します。

ビット単位式のいずれかのオペランドが NULL になる可能性がある場合は、結果も NULL になる可能性があります。 ビット単位式のいずれかのオペランドに NULL 値がある場合、その式の結果は NULL 値になります。

単項ビット単位 BITNOT (~) 接頭演算子は、それが適用されるオペランドの各ビットを反転させます。 値 x のデータ・タイプが DECIMAL、REAL、DOUBLE、または DECFLOAT (16) の場合、~x のデータ・タイプは DECFLOAT(34) になります。それ以外の場合、データ・タイプは x のデータ・タイプと同じになります。

表 5. 2 項ビット単位演算
ビット単位演算 名前 説明
& BITAND 結果はビット・パターンであり、そこに含まれる各ビットは、入力引数の対応ビットに対して行われた論理 AND 演算の結果です。
| BITOR 結果はビット・パターンであり、そこに含まれる各ビットは、入力引数の対応ビットに対して行われた論理 OR 演算の結果です。
^ BITXOR 結果はビット・パターンであり、そこに含まれる各ビットは、入力引数の対応ビットに対して行われた論理 XOR (排他 OR) 演算の結果です。
ビット単位 BITAND (&)、BITOR (|)、または BITXOR (ˆ) 式のどちらかのオペランドのデータ・タイプが DECFLOAT の場合、結果のデータ・タイプは DECFLOAT(34) になります。 それ以外の場合、結果のデータ・タイプは、データ・タイプの優先順位が最も高いデータ・タイプのオペランドのデータ・タイプになります ( 表 1を参照)。

ビット単位演算が行われる前に、LOB 以外のストリングであるオペランドは、CAST 指定の規則を使用して DECFLOAT(34) に変換されます。 詳しくは、 データ・タイプ間のキャストを参照してください。 グラフィック・ストリングのオペランドを含むビット単位演算は、Unicode データベースの場合のみ実行できます。

演算の優先順位

最初に、括弧の中の式および間接参照操作が左から右へと評価されます。 (括弧は、全選択、検索条件、関数でも使用される点に注意してください。 ただし、SQL ステートメント内でセクションを任意にグループ分けするのに使用することはできません。) 計算の順序が括弧で指定されていなければ、演算子は次の順に評価されます。
  1. 単項 BITNOT (~)
  2. 単項プラス (+) 接頭部または単項マイナス (-) 接頭部
  3. 指数 (**)
  4. 乗算 (*)、除算 (/)、モジュロ (%)、または連結 (CONCAT または ||)
  5. 加算 (+) または減算 (-)
  6. BITAND (&)、BITOR (|)、または BITXOR (^)。
  7. 述部。
  8. 論理 NOT。
  9. 論理 AND。
  10. 論理 OR。
同じ優先順位の演算子は、左から右へ評価されます。
図1: 演算の優先順位を説明するための例
sqls0opr

スカラー全選択

Scalar fullselect
Read syntax diagramSkip visual syntax diagram(fullselect)

スカラー全選択 は括弧で囲まれる全選択であり、1 つの列値で構成される 1 つの行を戻します。 全選択が行を戻さない場合、式の結果は NULL 値になります。 選択リスト・エレメントが単なる列名か間接参照の式である場合、 その列の名前に基づいて結果列の名前が付けられます。 スカラー全選択に必要な許可は、SQL 照会に必要な許可と同じです。

互換フィーチャー

SQL_COMPAT グローバル変数を 'NPS' に設定すると、次のようになります。
  • 記号 ^ は指数演算子と解釈され (** と等価)、BITXOR 演算子とは解釈されません。 記号 ** も指数演算子と解釈されます。
  • 記号 # は BITXOR 演算子と解釈されます。