SQL中CASE语句处理字段后转INT报1064语法错误如何解决
错误原因
- 语法错误核心:MySQL的
CAST()函数不支持直接用INT作为转换目标类型,整数类型需要指定为SIGNED(有符号整数)或UNSIGNED(无符号整数)。 - 逻辑遗漏:样例数据中存在
_这类既不是数字也不是%的无效值,就算修正语法,直接转换这类值时MySQL会隐式截断返回0,同时抛出数据截断警告,不符合返回NULL的预期。
正确实现代码
SELECT col, CASE -- 移除%后判断内容是否为纯数字,是则转为整数,否则返回NULL WHEN REPLACE(col, '%', '') REGEXP '^[0-9]+$' THEN CAST(REPLACE(col, '%', '') AS SIGNED) ELSE NULL END AS colInt FROM test;
执行结果
对应提供的样例数据,返回的colInt列值完全符合预期:
- 原col值
7%→ 7 - 原col值
_→ NULL - 原col值
9→ 9 - 原col值
60%→ 60
补充说明
- 如果后续需要处理带小数的百分比值,可以将正则规则调整为
^[0-9]+(\\.[0-9]+)?$,同时将转换目标类型改为DECIMAL(总长度,小数位数)即可,例如DECIMAL(10,2) - 上述正则判断已经覆盖了空字符串、特殊符号等所有非纯数字场景,不需要额外编写空字符串判断分支。
内容的提问来源于stack exchange,提问作者Conor Carroll
相关产品推荐
相关产品推荐

