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.'

第一个选择的返回值显然是十进制(11,0)类型。此处记录了合并函数的类型统一(请参阅数字操作数)。遵循这些说明并向后解析小数(11,0)意味着文字1 被解释为一个大整数

第二个选择的返回类型是小数(7,0)。可以在此处阅读 DB2 在乘法上的行为方式(结果的精度是两个操作数的精度之和)。在这种情况下,这意味着文字1 被解释为一个小整数

请注意,该char(..)函数仅用于显示返回值的精度和小数位数。

当有一个整数文字时(如1上面的示例),我如何知道 DB2 如何解释它(smallint、largeint、bigint)?

我正在使用 DB2 for z/OS v11。

4

1 回答 1

2

所有适合大整数的数字常量都被解释为这样 - 除非它们不是,谢谢 IBM ;)。

在第二种情况下,您必须查看文字出现的上下文,即在算术表达式中。SQLReference 的“使用整数和小数操作数的算术”部分明确描述了该行为:

已转换为十进制数的整数的临时副本的精度为 p,小数位数为 0。对于大整数,p 为 19,对于大整数,p 为 11,对于小整数,p 为 5。在整数常量的情况下,p 取决于整数常量中的位数。对于由 5 位或更少位数组成的整数常量,p 为 5。否则,p 与整数常量中的位数相同。

因此,对常量的处理不同于各种“内置”二进制数据类型。常量值(尽管定义为二进制)更像是十进制常量。

于 2016-06-28T07:09:14.250 回答