[英]why is to_char() giving a negative results to a positive number?
我有下面的sql代码,它给出查询后打印的输出。 DSPNSD_NDC
是一个可变字符(11)。 为什么在TO_CHAR
列中得到否定结果?
SELECT TO_NUMBER(DECODE(TRANS.DSPNSD_NDC,'',NULL,TRANS.DSPNSD_NDC),99999999999),
TO_CHAR(TO_NUMBER(DECODE(TRANS.DSPNSD_NDC,'',NULL,TRANS.DSPNSD_NDC),99999999999),'FM00000000000'),
DSPNSD_NDC
FROM SRW_NDW_TRANS TRANS;
TO_NUMBER TO_CHAR DSPNSD_NDC
68180021209 -00539455527 68180021209
68382070201 -00337406535 68382070201
10702001801 02112067209 10702001801
50111045601 -01428561951 50111045601
这绝对是一些内部溢出的问题
(68180021209 modulo 2**31 ) + 00539455527 = 2**31
但是,为什么要从varchar转换为number然后又返回varchar? 只是添加前导零?
Netezza支持LPAD:
LPAD(TRANS.DSPNSD_NDC, 11, '0')
我认为答案是to_char()
不处理大整数,因此存在整数溢出问题。
一种解决方案是仅使用cast()
:
cast(DECODE(TRANS.DSPNSD_NDC,'',NULL,TRANS.DSPNSD_NDC) as char(11))
但是,您随后需要将数字填充为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.