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

Sql 如何将数字(10,6)数据类型列值插入数字(8,6)数据类型列,sql,netezza,Sql,Netezza,我有一个带有COL1 NUMERIC8,6的表TABLEA,需要从第二个表TABLEB中插入一个值,该表TABLEB包含一个值123.000000。我尝试了以下场景。在这种情况下,我必须使用NVL函数并一起强制转换 下面也试过了 CAST(NVL(COL1,0) AS NUMERIC(10,6)) -- ERROR: 0 : Numeric value out of range 任何见解都会有所帮助。 提前谢谢 NUMERIC(p,s) | Exact numerical, precisi

我有一个带有COL1 NUMERIC8,6的表TABLEA,需要从第二个表TABLEB中插入一个值,该表TABLEB包含一个值123.000000。我尝试了以下场景。在这种情况下,我必须使用NVL函数并一起强制转换

下面也试过了

CAST(NVL(COL1,0) AS NUMERIC(10,6)) -- ERROR:  0 : Numeric value out of range
任何见解都会有所帮助。 提前谢谢

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))
您需要更改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,所以numeric8,6不能存储任何小数点左边超过2位的数字。即,无法存储任何大于等于100的数字

重要的一点是: netezza中的十进制/数字数据类型作为浮点值存储在封面下。因此,如果从numeric7,X到numeric14,X或从numeric4,X到numeric6,X,则不会“浪费”数据库中的任何空间

有关这些超低级数据类型的更多详细信息,请参见此处:
请注意,CPU内部处理的是二进制数据类型base number 2,大多数人使用base-10数字来讨论这些问题。网络上还有其他更详细的解释,但这与这一点无关:

你拥有的数字无法放入数字8,6中,这方面的错误很明显。我们不能神奇地把一夸脱装进一品脱的罐子里。我不应该改变TableA的结构,那么有什么方法可以插入TableA中呢。?纳闷@Samah你明白你面临的问题吗?如果您尝试将123存储在最大可能值为99.9999999的列中,那么当您稍后从列中读取该值时,您希望得到什么?请注意,获得123是不可能的!是的,我明白。只是想看看是否有我可能错过的任何可能性!谢谢你的投入@Samah如果您不应该更改TableA结构,那么可能这意味着指定表的人认为诸如100123之类的值对于Col1无效?如果是这样的话,那么您可能更应该考虑如何处理包含无效数据的行,而不是如何存储无效值?例如,也许您根本不应该插入行,而应该在其他地方记录错误。或者插入包含所有有效值的行,并设置Col1=NULL。虽然此代码可以回答此问题,但提供有关如何和/或为什么解决此问题的其他信息将提高答案的长期值。记住,你是在将来回答读者的问题,而不仅仅是现在提问的人!请在回答中添加解释,并说明适用的限制和假设。提到为什么这个答案比其他答案更合适也没什么坏处。但精度值确实决定了使用的字节数。9或更小的精度是4字节,10到18是8字节,任何19或更高的精度都是16字节。有关详细信息,请参阅。谢谢,您的链接实际上就是我要查找的链接:。如果你同意的话,我会把它加到我的帖子里?
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)*/
Data type | Description ------------- | ----------- DECIMAL(p,s) | Exact numerical, precision p, scale s. Example: decimal(5,2) is a number that has 3 digits before the decimal and 2 digits after the decimal NUMERIC(p,s) | Exact numerical, precision p, scale s. (Same as DECIMAL)