如何处理Records列:替换非纯数字条目为NULL并转换为数值型数据?
解决方法
你的核心问题是逻辑方向错了:你需要的是判断字段是否为纯数字,是则保留,否则设为NULL,而不是尝试移除非数字字符后转数值。另外你写的正则表达式也存在错误,导致结果不符合预期。
问题根源
- 正则表达式错误:
[%A-Za-z%+$]里的%是字面字符,不是通配符,这个模式只能匹配字母、%、+、$,但像空格、括号这类特殊字符不会被匹配,所以无法处理5000 (approx)这类带括号和空格的内容。 - 逻辑偏差:即使修正正则移除非数字字符,也会把
5000 (approx)变成5000,但你需要的是把这类非纯数字条目直接设为NULL,而非提取其中的数字。
正确实现(分常见数据库)
PostgreSQL
使用正则匹配判断是否为纯数字,结合CASE语句返回结果:
SELECT "Year", CASE WHEN "Records" ~ '^[0-9]+$' THEN "Records"::numeric ELSE NULL END AS "Records" FROM records_table;
^[0-9]+$:正则表示从字符串开头到结尾全是数字(至少1位)- 匹配成功则转成数值型,失败则返回NULL
MySQL
使用REGEXP操作符做判断:
SELECT `Year`, CASE WHEN `Records` REGEXP '^[0-9]+$' THEN CAST(`Records` AS UNSIGNED) ELSE NULL END AS `Records` FROM records_table;
补充说明
如果你的字段里可能包含小数(比如123.45),只需把正则改成^[0-9]+(\.[0-9]+)?$即可适配小数场景。
内容的提问来源于stack exchange,提问作者Omnibus
相关产品推荐
相关产品推荐

