我注意到nzsql和' nzunload'只是截断双精度列的尾数值。这是问题所在:
从table1中选择tot_amt
;
tot_amt
~~~~~~~
123.124
567.678
当我使用像Aginity这样的其他客户进行数据分析时 - 我得到的输出是
tot_amt
~~~~~~~
123.1240535
567.6780122
此外,我还发现了“截断”字样。 在netezza遇到3个尾数后的数字时发生。
我们正在尝试将此数据库迁移到oracle,并且由于此问题,整个项目都是混乱的,客户端不信任我们的迁移脚本。有没有人遇到过这个问题?唯一的解决方法,甚至是IBM工程师将其强制转换为TO_CHAR( '999,999.999', col )
如果必须为数十亿行执行此操作,这将终止卸载脚本。
答案 0 :(得分:0)
我可以重现这个问题,我有一个用FLOAT(6)作为列创建的表,例如:
USERDB.USER(USER)=> create table ZZ (
USERDB.USER(USER)(> YY FLOAT(6)
USERDB.USER(USER)(> );
CREATE TABLE
USERDB.USER(USER)=> insert into ZZ (yy) values (123.123456789);
INSERT 0 1
USERDB.USER(USER)=> insert into ZZ (yy) values (12.123456789);
INSERT 0 1
USERDB.USER(USER)=> select * from ZZ;
YY
---------
123.123
12.1234
(2 rows)
USERDB.USER(USER)=> select CAST ( YY as FLOAT(15) ) from ZZ;
?COLUMN?
----------------
123.1234588623
12.123399734497
(2 rows)
USERDB.USER(USER)=>
我可以将列值转换为更宽的类型,但是我看到的问题是我插入的值与返回的值不同。如果我也使用Aginity进行查询,则值也是如此。
检查table1中'tot_amt'列的精度(和比例),我猜用于存储值的数据类型非常小(可能是FLOAT(6)?),NZSQL告诉你正确的值为强制执行按数据类型。