DECIMAL または DEC スカラー関数
DECIMAL 関数は、数値の 10 進表記、数値のストリング表記、または日時値を返します。
数値から DECIMAL へ
ストリングから DECIMAL へ
日時から DECIMAL へ
スキーマは 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 ストリング表記の値を戻す expression。
string-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+tp、tp) 値になります。
- scale
- 結果の位取りを指定する整数定数 (値の範囲は 0 から precision)。 この指定がなく、precision が指定されている場合、デフォルトは 0 です。
結果は、CAST(datetime - expression AS DECIMAL(precision, scale)) の場合の結果と同じ数値になります。小数点文字より右側の数字の桁数が、位取り scale より多い場合、10 進数の終わりから数字が切り捨てられます。string-expression の小数点文字の左側にある有効数字 (数値の整数部分) の桁数が precision - scale よりも多い場合は、エラーが戻されます (SQLSTATE 22003)。
例
- 例 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 に設定します。
newsalary の値は 21400.50 になります。UPDATE STAFF SET SALARY = DECIMAL(:newsalary, 9, 2, ',') WHERE ID = :empid; - 例 4: 値にデフォルト値の小数点文字 (.) を追加します。
小数点文字としてピリオド (.) を指定しているのに、第 1 引数の中で区切り文字としてコンマ (,) が使われているため、これは失敗します。DECIMAL('21400,50', 9, 2, '.') - 例 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 進数結果とその結果の精度と位取りを示しています。以下の列と関連値があることが前提となっています。
以下の表は、 各種の日時入力値の 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 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
