[编程笔记] 人大金仓数据库numeric类型推导问题
问题现象:22003 numeric field overflow
问题原因:这个根源是 PG / 人大金仓(KES)的类型推导机制,属于数据库内核的行为,不是 bug,但属于容易踩坑的特性。人大金仓基于 PostgreSQL,PG 原生就有这个现象。
处理结果:THEN 0改为THEN CAST(0 AS numeric(16,4))即可解决问题
复现SQL:
DROP TABLE IF EXISTS qty_repro_test.stock_demo; GO DROP DOMAIN IF EXISTS qty_repro_test.u_qty; GO DROP SCHEMA IF EXISTS qty_repro_test; GO CREATE SCHEMA qty_repro_test; GO CREATE DOMAIN qty_repro_test.u_qty AS numeric(16,4) DEFAULT 0; GO CREATE TABLE qty_repro_test.stock_demo ( stock_qty qty_repro_test.u_qty, min_qty qty_repro_test.u_qty, max_qty qty_repro_test.u_qty ); GO INSERT INTO qty_repro_test.stock_demo (min_qty, max_qty) VALUES (5, 12); GO -- 对照查询:返回 12 SELECT CASE WHEN stock_qty >= min_qty THEN CAST(0 AS numeric(16,4)) ELSE max_qty - stock_qty END AS stock_suggess FROM qty_repro_test.stock_demo; GO -- 复现查询:预期出现 22003 numeric field overflow SELECT CASE WHEN stock_qty >= min_qty THEN 0 ELSE max_qty - stock_qty END AS stock_suggess FROM qty_repro_test.stock_demo; GO
SQL Server没这个问题,不做评价。
PS:转载请注明来源 https://www.cnblogs.com/sunshine-wy,疑问和勘误可在下方留言。
浙公网安备 33010602011771号