如何将数字(10,6)数据类型列值插入到numeric(8,6)数据类型列中



我有一个表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))

相关内容

最新更新