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

时间:2015-05-17 11:44:51

标签: sql rdbms netezza

我有下面的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

2 个答案:

答案 0 :(得分:2)

这绝对是一些内部溢出问题

(68180021209 modulo 2**31 ) + 00539455527 = 2**31

但是为什么要从varchar转换为数字然后再转回varchar? 只是添加前导零?

Netezza支持LPAD:

LPAD(TRANS.DSPNSD_NDC, 11, '0')

答案 1 :(得分:0)

我认为答案是to_char()不处理大整数,所以你有一个整数溢出问题。

一种解决方案就是使用cast()

cast(DECODE(TRANS.DSPNSD_NDC,'',NULL,TRANS.DSPNSD_NDC) as char(11))

但是,您需要用零填充数字。