0

次のクエリの結果は私を苛立たせます:

select
  char(coalesce(1, cast(5 as decimal(2,0)))) as a,
  char(1 * cast(5 as decimal(2, 0))) as b
from sysibm.sysdummy1;

a = ' 00000000001.'
b = ' 0000005.'

最初の選択の戻り値は、明らかに型 decimal(11,0) です。合体関数の型の統一については、こちらに記載されています(数値オペランドを参照)。これらの指示に従い、decimal(11,0) を逆方向に解決すると、リテラル1 は大きな整数として解釈されます。

2 番目の選択の戻り値の型は decimal(7,0) です。乗算に対する DB2 の動作については、こちらを参照してください(結果の精度は、両方のオペランドの精度の合計です)。この場合、これはリテラル1 が small integer として解釈されることを意味します。

このchar(..)関数は、戻り値の精度と位取りを示すためにのみ適用されていることに注意してください。

(上記の例のように) 整数リテラルがある場合1、DB2 がそれをどのように解釈するか (smallint、largeint、bigint) を知るにはどうすればよいですか?

DB2 for z/OS v11 を使用しています。

4

1 に答える 1

2

大きな整数に収まるすべての数値定数は、そのように解釈されます - そうでない場合を除き、IBM に感謝します ;)。

2番目のケースでは、算術式内にあるリテラルが表示されるコンテキストを確認する必要があります。この動作は、SQLReferenceのセクション「整数と 10 進オペランドによる算術演算」で明示的に説明されています。

10 進数に変換された整数の一時コピーの精度は p で、位取りは 0 です。p は、大きな整数の場合は 19、大きな整数の場合は 11、小さな整数の場合は 5 です。整数定数の場合、p は整数定数の桁数に依存します。5 桁以下の整数定数の場合、p は 5 です。それ以外の場合、p は整数定数の桁数と同じです。

したがって、定数の処理は、あらゆる種類の「組み込み」バイナリ データ型とは異なります。定数値 (定義上は 2 進数ですが) は、10 進定数のように扱われます。

于 2016-06-28T07:09:14.250 に答える