存储过程INT转DECIMAL异常:求和时INT变REAL的技术求助
解决SUM(INT)返回REAL类型的问题
嘿,我碰到过类似的情况,给你几个实用的解决思路:
显式强制转换结果类型
最直接的办法就是用CAST或CONVERT把SUM的结果转成INT类型,还可以搭配COALESCE处理没有匹配行时返回的NULL:SELECT CAST(SUM(attendance) AS INT) FROM core_historic_modestatistik WHERE medlemsid = uID; -- 若要把NULL转为0,避免后续逻辑出错 SELECT COALESCE(CAST(SUM(attendance) AS INT), 0) FROM core_historic_modestatistik WHERE medlemsid = uID;确认列的实际数据类型
虽然你说attendance是INT,但有时候表结构可能有隐性变化(比如之前是REAL类型后来修改?或者是带计算逻辑的列?),建议先核实列的真实类型:-- MySQL/MariaDB 写法 DESCRIBE core_historic_modestatistik; -- SQL Server 写法 SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'core_historic_modestatistik' AND COLUMN_NAME = 'attendance'; -- PostgreSQL 写法 SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'core_historic_modestatistik' AND column_name = 'attendance';确保列确实是纯INT类型而非带小数的数值类型。
利用变量强制类型约束(存储过程内)
在存储过程里,把SUM的结果赋值给一个INT类型的变量,数据库会自动做类型约束转换(前提是总和不超出INT的范围):-- 以SQL Server为例,其他数据库语法类似 DECLARE @total_attendance INT; SELECT @total_attendance = SUM(attendance) FROM core_historic_modestatistik WHERE medlemsid = uID; -- 后续返回@total_attendance即可考虑总和溢出的情况
如果attendance的总和有可能超过INT的最大值(比如2^31-1,也就是2147483647),那更推荐用BIGINT类型来存储结果——既避免溢出报错,又比REAL类型更精准(REAL是浮点型,会有精度损失)。
内容的提问来源于stack exchange,提问作者JoSSte
相关产品推荐
相关产品推荐

