在 DB2 中執行整數除法時,若被除數小於除數(如 3/5),結果會被截斷為 0 而非 0.6。這是因為 DB2 預設對整數型別執行整數除法,捨棄小數部分。本文提供兩種實用修正方案。
SELECT field1/field2 FROM TB;
-- field1 < field2 時,結果顯示 0,實際應為 0.xxxxxx
MIN_DEC_DIV_3 參數控制十進制除法的最小小數位數:
31 - p + s - s'(p=精度, s=標度),可能為 0。MAX(3, 31-p+s-s'),保證至少 3 位小數,精度固定 31。缺點:需 DBA 修改資料庫配置並重啟實例,影響範圍廣,生產環境變更風險高。
將被除數或除數轉為 DOUBLE 或 DECIMAL,觸發浮點/定點運算:
-- 基礎修正:保留小數
SELECT CAST(field1 AS DOUBLE) / field2 FROM TB;
-- 進階:四捨五入保留 2 位小數
SELECT ROUND(CAST(field1 AS DOUBLE) / field2, 2) FROM TB;
若任一欄位為 NULL,結果將為 NULL。使用 COALESCE 將 NULL 替換為 0:
SELECT ROUND(COALESCE(CAST(field1 AS DOUBLE), 0) / field2, 2) FROM TB;
| 場景 | 寫法 | 說明 |
|---|---|---|
| 字串可空 | COALESCE(col, '') | NULL 轉空字串 |
| 數值可空 | COALESCE(col, 0) | NULL 轉 0 |
| 字串非空非空白 | COALESCE(col, '') | 轉空字串後判斷長度 |
| 數值非空 | col IS NOT NULL | 直接判斷,無需 COALESCE |
優先採用 方案二:SQL 明確轉型 + ROUND 控制精度 + COALESCE 防禦 NULL。無需 DBA 介入,邏輯集中在代碼層,易於維護與代碼審查。