以下查询的结果让我感到恼火:
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)。 coalesce函数的类型统一记录为here(参见数字操作数)。遵循这些说明并向后解析小数(11,0)意味着文字 1被解释为大整数。
第二个选择的返回类型是小数(7,0)。 DB2的乘法行为如何读取here(结果的精度是两个操作数的精度之和)。在这种情况下,这意味着文字 1被解释为一个小整数。
请注意,char(..)
函数仅用于显示返回值的精度和比例。
当有一个整数文字(如上例中的1
)时,我怎么知道DB2如何解释它(smallint,largeint,bigint)?
我正在使用DB2 for z / OS v11。
答案 0 :(得分:2)
所有适合大整数的数字常量都被解释为 - 除非它们不是,谢谢IBM;)。
在第二种情况下,您必须查看文字出现的上下文,即在算术表达式中。该行为在SQLReference的"Arithmetic with an integer and a decimal operand"部分中明确描述:
已转换为十进制数的整数的临时副本具有精度p和小数位数0.对于大整数,p为19,对于大整数,p为11,对于小整数,p为5。在整数常量的情况下,p取决于整数常量中的位数。对于由5位或更少数字组成的整数常数,p为5。否则,p与整数常量中的位数相同。
因此常量的处理不同于各种“内置”二进制数据类型。常量值(虽然定义为二进制)被视为十进制常量。