以下查询的结果激怒了我:
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)。此处记录了Colesce函数的类型统一(请参阅数字操作数)。按照以下说明并将小数(11,0)向后解决,这意味着文字 1被解释为大整数。
第二选择的返回类型是十进制(7,0)。可以在此处阅读DB2在乘法上的表现(结果的精度是两个操作数的精度之和)。在这种情况下,这意味着文字 1被解释为一个小整数。
请注意,char(..)
函数仅应用于显示返回值的精度和比例。
具有整数字面形式(例如上面的示例中的1
),我如何知道DB2如何解释它(SmallInt,glotint,bigint)?
我正在为Z/OS V11使用DB2。
所有适合大整数的数字常数被解释为这样 - 除非它们不是,谢谢ibm;)。
在您的第二种情况下,您必须看到字面出现的上下文,即在算术表达式内。该行为在"用整数和十进制操作数"部分中明确描述:
:已将其转换为十进制数字的整数的临时副本具有精度为P和0。尺度为0。p对于一个大整数,大整数为11,小整数为5。在整数常数的情况下,P取决于整数常数中的数字数量。对于由5位或更少的整数常数来说,P为5。否则,P与整数常数中的数字数相同。
因此,对常数的处理与各种"内置"二进制数据类型不同。恒定值(尽管按定义为二进制)更像是十进制常数。