我的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,但它不起作用。
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之外对其进行一次评估。