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= 之外对其进行一次评估]