我有一个表TABLEA with COL1 NUMERIC(8,6)
,需要从第二个表中插入一个值TABLEB
其中包含一个值123.000000
。我尝试了以下场景。在这种情况下,我必须一起使用NVL
函数并一起CAST
SELECT CAST(899.000000 AS NUMERIC(8,6))-- This gives Numeric overflow. Value does not fit in a numeric(8,6)
下面也试过
CAST(NVL(COL1,0) AS NUMERIC(10,6)) -- ERROR: 0 : Numeric value out of range
任何见解都会有所帮助。 提前谢谢。
重要说明: Netezza 中的十进制/数字数据类型在后台存储为浮点值。因此,如果您从数字(7,X)到数字(14,X)或从数字(4,X)到数字(6,X),则不会"浪费"数据库内的任何空间。
有关这些超低级数据类型的更多详细信息,请在此处查看:https://www.tutorialspoint.com/cprogramming/c_data_types.htm 请注意,CPU在内部处理二进制数据类型(基数2),大多数人使用以10为基数来讨论这些事情。网络上存在其他(更详细)的解释,但这与这一点无关:)
更改TABLEA.COL1
的数据类型
请注意以下几点:
SELECT CAST(899.00000 AS NUMERIC(8,6)) /*Overflow*/
SELECT CAST(899.00000 AS NUMERIC(8,5)) /*Works*/
SELECT CAST(899.00000 AS NUMERIC(9,6)) /*Works*/
SELECT CAST(99.123456 AS NUMERIC(8,6)) /*Works*/
SELECT CAST(100 AS NUMERIC(8,6)) /*Overflow*/
SELECT CAST(99.9999994 AS NUMERIC(8,6)) /*Works (rounds down to 99.999999)*/
SELECT CAST(99.9999995 AS NUMERIC(8,6)) /*Overflow (rounds up to 100)*/
基本上,"(8 - 6) == 2",因此numeric(8, 6)
不能存储小数点剩下超过 2 位的任何数字。 即不能存储任何数字>= 100
。
从 w3schools.com
数据类型 |描述 ------------- |----------- 十进制(p,s) |精确数字、精度 p、小数位数 s。 示例:十进制 (5,2) 是一个具有 小数点前 3 位数字,小数点后 2 位数字 数字(p,s) |精确数字、精度 p、小数位数 s.(与十进制相同)
NUMERIC(p,s) | Exact numerical, precision p, scale s
在您的查询中,精度值为 8,这就是克服流错误的原因。实际精度值为 9。
SELECT CAST(899.000000 AS NUMERIC(8,6)
我已经更新了您的查询,如下所示。
SELECT CAST(899.000000 AS NUMERIC(9,6))