SQL如何查询VARCHAR类型字段中存储的有效数值数据
解决方案
不同数据库环境的实现方式略有区别,以下是主流数据库的可用方案:
1. SQL Server 环境
你遇到的类型转换提示是因为ISNUMERIC()仅判断内容是否可转为数值,但不会自动处理转换逻辑,建议优先使用TRY_CAST/TRY_CONVERT函数,转换失败会返回NULL不会抛出报错,写法更安全:
SELECT * FROM 你的表名 WHERE -- 先明确排除N.A.的记录 profit <> 'N.A.' -- 判断内容可正常转为数值即可保留 AND TRY_CAST(profit AS DECIMAL(18,2)) IS NOT NULL;
如果需要搭配ISNUMERIC()使用,要额外增加显式类型转换逻辑:
SELECT * FROM 你的表名 WHERE profit <> 'N.A.' AND ISNUMERIC(profit) = 1 -- 显式转换为数值类型后即可正常做数值判断 AND CAST(profit AS DECIMAL(18,2)) BETWEEN -100000 AND 100000; -- 这里替换为你需要的数值筛选条件
2. MySQL 环境
MySQL没有原生ISNUMERIC()函数,可根据版本选择方案:
兼容所有版本的正则匹配方案
SELECT * FROM 你的表名 WHERE profit <> 'N.A.' -- 匹配正负整数、小数格式的字符串 AND profit REGEXP '^[-+]?[0-9]*\.?[0-9]+$';
MySQL 8.0+ 版本用TRY_CAST的方案
SELECT * FROM 你的表名 WHERE profit <> 'N.A.' AND TRY_CAST(profit AS DECIMAL(18,2)) IS NOT NULL;
3. PostgreSQL 环境
SELECT * FROM 你的表名 WHERE profit <> 'N.A.' AND TRY_CAST(profit AS NUMERIC) IS NOT NULL;
注意:优先用数据库自带的TRY_xxx转换函数,比单纯的正则或者ISNUMERIC更可靠,可避免
$、,这类特殊字符被ISNUMERIC误判定为可转换数值的异常问题。
内容的提问来源于stack exchange,提问作者julz oh
相关产品推荐
相关产品推荐

