使用CASE语句按TYPE字段转换AMOUNT列正负值遇数据格式错误问题
错误原因
你写的SQL有两个核心问题导致无法运行:
- CASE语句的两个分支返回值类型不统一:
THEN分支返回的是数值类型的计算结果,ELSE分支你写的是字符串格式的'null',类型冲突触发格式错误;同时你的逻辑里TYPE为+时应该返回原AMOUNT值,也不需要返回null。 - 表名配置错误:
dual是部分数据库提供的系统虚表,不能用来存放你的业务数据,需要替换为你实际存储ID、TYPE、AMOUNT三列的业务表名。
修正后的SQL
如果要直接替换查询结果里的AMOUNT列,可使用以下语句:
SELECT a.ID, a.TYPE, CASE WHEN a.TYPE = '-' THEN a.AMOUNT * -1 ELSE a.AMOUNT END AS AMOUNT FROM 你的实际表名 a
如果需要保留原始AMOUNT列,可给计算后的新列单独设置别名:
SELECT a.*, CASE WHEN a.TYPE = '-' THEN a.AMOUNT * -1 ELSE a.AMOUNT END AS SIGNED_AMOUNT FROM 你的实际表名 a
特殊场景适配
如果你的AMOUNT字段是字符串格式存储的数值,需要先转为数值类型再计算,以MySQL为例可按以下写法调整:
SELECT a.ID, a.TYPE, CASE WHEN a.TYPE = '-' THEN CAST(a.AMOUNT AS SIGNED) * -1 ELSE CAST(a.AMOUNT AS SIGNED) END AS AMOUNT FROM 你的实际表名 a
内容的提问来源于stack exchange,提问作者Ren Cantu
相关产品推荐
相关产品推荐

