我有下面的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
答案 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))
但是,您需要用零填充数字。