DECIMAL または DEC スカラー関数

DECIMAL 関数は、数値の 10 進表記、数値のストリング表記、または日時値を返します。

数値から DECIMAL へ

構文図を読む構文図をスキップする DECIMALDEC (numeric-expression ,precision,scale )

ストリングから DECIMAL へ

構文図を読む構文図をスキップする DECIMALDEC (string-expression ,precision,scale,decimal-character )

日時から DECIMAL へ

構文図を読む構文図をスキップする DECIMALDEC (datetime-expression ,precision,scale)

スキーマは SYSIBM です。

数値から DECIMAL へ
numeric-expression
組み込み数値データ・タイプの値を戻す式。
precision
1 から 31 の範囲の値の整数定数。デフォルトの精度は、入力式のデータ・タイプによって異なります。
  • 10 進浮動小数点数の場合は 31 (DECFLOAT)
  • 浮動小数点 (REAL または DOUBLE) または 10 進数 (DECIMAL) の場合は 15
  • 64 ビット整数 (BIGINT) の場合は 19
  • 長精度整数 (INTEGER) の場合は 11
  • 短精度整数 (SMALLINT) の場合は 5
scale
0 から precision の値までの範囲の整数定数。 デフォルトの位取りはゼロです。

結果は、最初の引数が精度 precision、位取り scale の 10 進数の列または変数に割り当てられた場合と同じ数になります。小数点文字より右側の数字の桁数が、位取り scale より多い場合、10 進数の終わりから数字が切り捨てられます。数値の整数部分を表すために必要な有効 10 進桁数が、precision - scale より大きい場合はエラーが戻されます (SQLSTATE 22003)。

ストリングから DECIMAL へ
string-expression
文字定数の最大長以下の長さを持つ数の文字ストリングまたは Unicode GRAPHIC ストリング表記の値を戻す expressionstring-expression のデータ・タイプは、CLOB または DBCLOB にしてはなりません (SQLSTATE 42884)。先行ブランクと末尾ブランクはストリングから削除されます。 その結果のストリングは、整数、10 進数、浮動小数点数、または 10 進浮動小数点定数を形成するための規則に準拠していなければなりません (SQLSTATE 22018)。

定数 decimal-character のコード・ページに一致させるために必要であれば、string-expressionセクション・コード・ページに変換されます。

precision
結果の精度を指定する整数定数 (値の範囲は 1 から 31)。 この指定がない場合のデフォルト値は 15 です。
scale
結果の位取りを指定する整数定数 (値の範囲は 0 から precision)。 この指定がない場合のデフォルト値は 0 です。
decimal-character
string-expression の小数部分と整数部分とを区切るために使用する 1 バイト文字定数を指定します。 この文字には、数字、プラス (+)、マイナス (-)、またはブランクを使用できず、 string-expression の中に最高で 1 回しか使用することができません (SQLSTATE 42815)。

結果は、CAST(string-expression AS DECIMAL(precision, scale)) の場合の結果と同じ数値になります。小数点文字より右側の数字の桁数が、位取り scale より多い場合、10 進数の終わりから数字が切り捨てられます。string-expression の小数点文字の左側にある有効数字 (数値の整数部分) の桁数が precision - scale よりも多い場合は、エラーが戻されます (SQLSTATE 22003)。decimal-character 引数に別の値が指定されている場合、 サブストリングに使われているデフォルトの小数点文字は無効になります (SQLSTATE 22018)。

日時から DECIMAL へ
datetime-expression
タイプ DATE、TIME、または TIMESTAMP の値を戻す式。
precision
結果の精度を指定する整数定数 (値の範囲は 1 から 31)。 この指定がない場合、精度および位取りのデフォルトは、以下のように datetime-expression のデータ・タイプによって決まります。
  • DATE の場合は、精度が 8 で、位取りが 0 です。結果は、日付を yyyymmdd で表した DECIMAL(8,0) 値になります。
  • TIME の場合は、精度が 6 で、位取りが 0 です。結果は、時間を hhmmss で表した DECIMAL(6,0) 値になります。
  • TIMESTAMP(tp) の場合は、精度が 14+tp で、位取りが tp です。 結果は、タイム・スタンプを yyyymmddhhmmss.nnnnnnnnnnnn で表した DECIMAL(14+tptp) 値になります。
scale
結果の位取りを指定する整数定数 (値の範囲は 0 から precision)。 この指定がなく、precision が指定されている場合、デフォルトは 0 です。

結果は、CAST(datetime - expression AS DECIMAL(precision, scale)) の場合の結果と同じ数値になります。小数点文字より右側の数字の桁数が、位取り scale より多い場合、10 進数の終わりから数字が切り捨てられます。string-expression の小数点文字の左側にある有効数字 (数値の整数部分) の桁数が precision - scale よりも多い場合は、エラーが戻されます (SQLSTATE 22003)。

最初の引数が NULL になる可能性がある場合、結果も NULL になる可能性があります。 最初の引数が NULL であれば、結果は NULL 値になります。
注: CAST 指定 はアプリケーションの移植性を高めるために使用してください。詳しくは、 『CAST 指定』を参照してください。

  • 例 1: EMPLOYEE 表の EDLEVEL 列 (データ・タイプ = SMALLINT) の選択リストに (精度が 5 で、 位取りが 2 の) DECIMAL データ・タイプが必ず戻されるように DECIMAL 関数を使用します。 選択リストには、EMPNO 列も入れておいてください。
       SELECT EMPNO, DECIMAL(EDLEVEL,5,2)
         FROM EMPLOYEE
  • 例 2: ホスト変数 PERIOD のタイプが INTEGER であるとします。 その値を日付期間として使用するためには、 それを decimal(8,0) として「キャスト」する必要があります。
       SELECT PRSTDATE + DECIMAL(:PERIOD,8)
         FROM PROJECT
  • 例 3: SALARY 列の更新内容が、 小数点文字にコンマを使用した文字ストリングとして、 ウィンドウから入力されるものとします (ユーザーは、 例えば 21400,50 と入力します)。 アプリケーションが妥当性検査を行った後、 これを、CHAR(10) として定義されたホスト変数 newsalary に設定します。
       UPDATE STAFF
         SET SALARY = DECIMAL(:newsalary, 9, 2, ',')
         WHERE ID = :empid;
    newsalary の値は 21400.50 になります。
  • 例 4: 値にデフォルト値の小数点文字 (.) を追加します。
       DECIMAL('21400,50', 9, 2, '.')
    小数点文字としてピリオド (.) を指定しているのに、第 1 引数の中で区切り文字としてコンマ (,) が使われているため、これは失敗します。
  • 例 5: STARTING (データ・タイプは TIME) 列に、'12:10:00' に相当する内部値が入っていると想定します。
       DECIMAL(STARTING)
    結果は、121 000 の値になります。
  • 例 6: RECEIVED (データ・タイプは TIMESTAMP) 列に、 '1988-12-22-14.07.21.136421' に相当する内部値が入っていると想定します。
       DECIMAL(RECEIVED)
    結果は、19 881 222 140 721.136421 の値になります。
  • 例 7: この例は、 各種の日時入力値の 10 進数結果とその結果の精度と位取りを示しています。以下の列と関連値があることが前提となっています。
    列名 データ・タイプ
    ENDDT DATE 2000-03-21
    ENDTM TIME 12:02:21
    ENDTS TIMESTAMP 2000-03-21-12.02.21.123456
    ENDTS0 TIMESTAMP(0) 2000-03-21-12.02.21
    ENDTS9 TIMESTAMP(9) 2000-03-21-12.02.21.123456789
    以下の表は、 各種の日時入力値の 10 進数結果とその結果の精度と位取りを示しています。
    DECIMAL(引数) 精度と位取り 結果
    DECIMAL(ENDDT) (8,0) 20000321.
    DECIMAL(ENDDT, 10) (10,0) 20000321.
    DECIMAL(ENDDT, 12, 2) (12,2) 20000321.00
    DECIMAL(ENDTM) (6,0) 120221.
    DECIMAL(ENDTM, 10) (10,0) 120221.
    DECIMAL(ENDTM, 10, 2) (10,2) 120221.00
    DECIMAL(ENDTS) (20, 6) 20000321120221.123456
    DECIMAL(ENDTS, 23) (23, 0) 20000321120221.
    DECIMAL(ENDTS, 23, 4) (23, 4) 20000321120221.1234
    DECIMAL(ENDTS0) (14,0) 20000321120221.
    DECIMAL(ENDTS9) (23,9) 20000321120221.123456789