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