2

我在 PostgreSQL 中有一个表定义为:

CREATE TABLE ITEM_PROPERTIES
( 
  ITEM_ID NUMERIC(11,0),
  ITEM_DIMENSIONAL_UOM VARCHAR(30),
  ITEM_HEIGHT NUMERIC(38,14),
  ITEM_WIDTH NUMERIC(38,14),
  ITEM_LENGTH NUMERIC(38,14),
  ITEM_WEIGHT_UOM VARCHAR(30),
  ITEM_WEIGHT NUMERIC(38,14),
  ITEM_CUBE NUMERIC(38,14)
);

项目的长度/宽度/高度存储在表中,我需要通过以下 SQL 计算立方体:

update ITEM_PROPERTIES set ITEM_CUBE = ITEM_WIDTH*ITEM_HEIGHT*ITEM_LENGTH
where ITEM_WIDTH<10000 and ITEM_HEIGHT < 10000 and ITEM_LENGTH<10000;

然后我遇到了精度溢出:

ERROR: Resulting scale overflows maximum precision

如何解决这个问题?

4

3 回答 3

2

最后,这个 SQL 起作用了:

update ITEM_PROPERTIES set ITEM_CUBE = ITEM_WIDTH::decimal(12,3)*ITEM_HEIGHT::decimal(12,3)*ITEM_LENGTH::decimal(12,3)
where ITEM_WIDTH<10000 and ITEM_HEIGHT < 10000 and ITEM_LENGTH<10000;
于 2013-06-27T14:50:33.103 回答
0

您可以尝试将其四舍五入或按该顺序进行。

但真正的问题源于你的类型。如果长宽高都是numeric(38,14),体积应该更像numeric(114,42)。实际上还有更多,以适应在三个维度上都用完比例和精度的情况下的进位。

恕我直言,完全摆脱精度和规模:将数字存储为numeric而不是numeric(38,14),并避免问题可能出现在首位。(如果您确实需要 14 位小数,请在您的应用程序中将其四舍五入或使用前触发器。)

于 2013-06-27T11:49:20.717 回答
0

也许使用截断?

update ITEM_PROPERTIES set ITEM_CUBE = trunc(ITEM_WIDTH*ITEM_HEIGHT*ITEM_LENGTH, 14)
where
     ITEM_WIDTH<10000
     and ITEM_HEIGHT < 10000
     and ITEM_LENGTH<10000;
于 2013-06-27T10:13:58.843 回答