繁体   English   中英

为什么to_char()给出的结果为负数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM