2013-05-21 64 views
1

我跑在我们的老MySQL数据库精细的查询,其中有一个检查:如何避免数值数据溢出

WHERE column_x + column_y > 524288000 

现在我们已经迁移到红移,查询失败:

ERROR: Numeric data overflow (addition) 
    Detail: 
    ----------------------------------------------- 
    error: Numeric data overflow (addition) 
    code:  1058 
    context: 
    query:  915381 
    location: numeric.hpp:112 
    process: query4_s0_22 [pid=6421] 
    ----------------------------------------------- [SQL State=XX000] 

两列均为bigint类型。在不添加列的情况下运行查询(仅针对一列或另一列进行检查)时,查询执行正常。我假设有column_x + column_y大于最大尺寸bigint的行。

这里有什么解决方法?

回答

2
WHERE column_x::numeric(20) + column_y::numeric(20) > 524288000 
+0

谢谢,它仍然溢出,但后来我试图明确设置大小,它很好地工作。一旦我的编辑被接受或做出其他澄清,我会接受这个答案。 – Dean

+0

@Dean您的编辑未被接受,但我编辑了它。它是这样工作吗? –

+0

我认为这是诀窍。 – Dean

1

多个由1/X :)比较(分将使其失败0)前:

WHERE column_x * (1/X) + column_y* (1/X) > 524288000* (1/X) 
+0

2应该做的是你的只添加两列 – user1937198

1

简单的变化加入到减法:

WHERE column_x > 524288000 - column_y 
+0

这是一个聪明的解决方案,将为我工作。尽管我应该提到,如果column_y可能具有巨大的负值,那么存在潜在的失败情况。 – Dean