DB2 比较具有非常大数字的数据
DB2 Comparing data with very large numbers
我的 DB2 SQL 查询失败并显示消息:sql0802N:发生算术溢出或其他算术异常。 SQL状态 = 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 '10-25 Lacs'
WHEN DATAAMT>=2500000 and DATAAMT<5000000 then '25-50 Lacs'
WHEN DATAAMT>=5000000 and DATAAMT<1*POWER(10, 7) then '50 Lacs-1 Cr'
WHEN DATAAMT>=1*POWER(10, 7) and DATAAMT<5*POWER(10, 7) then '1-5 Cr'
WHEN DATAAMT>=5*POWER(10, 7) and DATAAMT<50*POWER(10, 7) then '5-50 Cr'
WHEN DATAAMT>=50*POWER(10, 7) and DATAAMT<100*POWER(10, 7) then '50-100 Cr'
WHEN DATAAMT>=100*POWER(10, 7) and DATAAMT<500*POWER(10, 7) then '100-500 Cr'
WHEN DATAAMT>=500*POWER(10, 7) and DATAAMT<1000*POWER(10, 7) then '500-1000 Cr'
WHEN DATAAMT>=1000*POWER(10, 7) and DATAAMT<5000*POWER(10, 7) then '1000-5000 Cr'
WHEN DATAAMT>=5000*POWER(10, 7) and DATAAMT<10000*POWER(10, 7) then '5000-10000 Cr'
WHEN DATAAMT>=10000*POWER(10, 7) then 'Above 10000 Cr'
ELSE 'NA'
END;
COMMIT;
我检查了我的查询是否包含 case 语句,在该语句中我将列值与非常大的数字进行比较。它从数字 500 * POWER(10, 7) 开始失败。我该如何处理。我曾尝试将其转换为双倍,如 CAST(500 * POWER(10, 7) as DOUBLE) OR CONVERT 但它不起作用。
POWER returns INTEGER 如果两个参数都是 INTEGER 或 SMALLINT,而结果可能不适合。该问题可以用以下方式证明:
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.[=15= 之外对其进行一次评估]
我的 DB2 SQL 查询失败并显示消息:sql0802N:发生算术溢出或其他算术异常。 SQL状态 = 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 '10-25 Lacs'
WHEN DATAAMT>=2500000 and DATAAMT<5000000 then '25-50 Lacs'
WHEN DATAAMT>=5000000 and DATAAMT<1*POWER(10, 7) then '50 Lacs-1 Cr'
WHEN DATAAMT>=1*POWER(10, 7) and DATAAMT<5*POWER(10, 7) then '1-5 Cr'
WHEN DATAAMT>=5*POWER(10, 7) and DATAAMT<50*POWER(10, 7) then '5-50 Cr'
WHEN DATAAMT>=50*POWER(10, 7) and DATAAMT<100*POWER(10, 7) then '50-100 Cr'
WHEN DATAAMT>=100*POWER(10, 7) and DATAAMT<500*POWER(10, 7) then '100-500 Cr'
WHEN DATAAMT>=500*POWER(10, 7) and DATAAMT<1000*POWER(10, 7) then '500-1000 Cr'
WHEN DATAAMT>=1000*POWER(10, 7) and DATAAMT<5000*POWER(10, 7) then '1000-5000 Cr'
WHEN DATAAMT>=5000*POWER(10, 7) and DATAAMT<10000*POWER(10, 7) then '5000-10000 Cr'
WHEN DATAAMT>=10000*POWER(10, 7) then 'Above 10000 Cr'
ELSE 'NA'
END;
COMMIT;
我检查了我的查询是否包含 case 语句,在该语句中我将列值与非常大的数字进行比较。它从数字 500 * POWER(10, 7) 开始失败。我该如何处理。我曾尝试将其转换为双倍,如 CAST(500 * POWER(10, 7) as DOUBLE) OR CONVERT 但它不起作用。
POWER returns INTEGER 如果两个参数都是 INTEGER 或 SMALLINT,而结果可能不适合。该问题可以用以下方式证明:
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.[=15= 之外对其进行一次评估]