DB2将数据与非常大的数字进行比较



我的DB2 SQL查询失败,消息为:sql0802N:发生算术溢出或其他算术异常。SQLSTATE=22003

以下是代码:

ALTER TABLE MYSCHEMA.MYTABLE
ADD COLUMN DATA_BUCKET VARCHAR(255);
UPDATE MYSCHEMA.MYTABLE
SET DATA_BUCKET = CASE 
WHEN DATAAMT<1000000 then 'Less than 10 lacs' 
WHEN DATAAMT>=1000000 and DATAAMT<2500000 then 'CLASSA'
WHEN DATAAMT>=2500000 and DATAAMT<5000000 then 'CLASSB'
WHEN DATAAMT>=5000000 and DATAAMT<1*POWER(10, 7) then 'CLASSC'
WHEN DATAAMT>=1*POWER(10, 7) and DATAAMT<5*POWER(10, 7) then 'CLASSD'
WHEN DATAAMT>=5*POWER(10, 7) and DATAAMT<50*POWER(10, 7) then 'CLASSE'
WHEN DATAAMT>=50*POWER(10, 7) and DATAAMT<100*POWER(10, 7) then 'CLASSF'

WHEN DATAAMT>=100*POWER(10, 7) and DATAAMT<500*POWER(10, 7) then 'CLASSG'
WHEN DATAAMT>=500*POWER(10, 7) and DATAAMT<1000*POWER(10, 7) then 'CLASSH'
COMMIT;   

我检查了我的查询是否包含case语句,其中我将列值与非常大的数字进行比较。它从数字500*POWER(10,7(开始失败。我该怎么办。我试着把它像cast(500*POWER(10,7(作为double(或CONVERT一样转换为double,但它不起作用。

如果两个参数都是INTEGER或SMALLINT,则POWER返回INTEGER,而结果可能不符合此条件。这个问题可以用来证明
db2 "values POWER(10, 10)"
1          
-----------
SQL0802N  Arithmetic overflow or other arithmetic exception occurred.  
SQLSTATE=22003
db2 "describe values POWER(10, 10)"
Column Information
Number of columns: 1
SQL type              Type length  Column name                     Name length
--------------------  -----------  ------------------------------  -----------
496   INTEGER                   4  1                                    1

如果将其中一个参数强制转换为BIGINT,则结果也会强制转换为BIGINT:

db2 "values POWER(bigint(10), 10)"
1                   
--------------------
10000000000
1 record(s) selected.

你的问题源于一个整数乘以一个整数,得到一个整数。你提到500,但从215开始你将面临同样的问题:

db2 "values 214*POWER(10, 7)"
1          
-----------
2140000000
db2 "values 215*POWER(10, 7)"
1          
-----------
SQL0802N  Arithmetic overflow or other arithmetic exception occurred.  
SQLSTATE=22003

您可以通过使用bigint:强制转换其中一个参数来避免这种情况

db2 "values bigint(215)*POWER(10, 7), 215*POWER(10, bigint(7)), 215*POWER(bigint(10), 7)"
1                   
--------------------
2150000000
2150000000
2150000000
3 record(s) selected.

我可以在您的CASE表达式中看到使用POWER(…(的价值(清晰度(,但出于效率的原因,您可以考虑在SQL之外对其进行一次评估。

相关内容

  • 没有找到相关文章

最新更新