在 SQL Server 中,ISNUMERIC 是一个系统函数,用来检测表达式是否可以被转换为某种数值类型。它在数据清洗、类型判断以及条件过滤时非常实用,但行为上有些细节需要注意。

ISNUMERIC 基本语法
ISNUMERIC 的语法非常简单,只接收一个表达式参数:
-- 判断字符串是否为数值
SELECT ISNUMERIC('123') AS result; -- 返回 1
SELECT ISNUMERIC('abc') AS result; -- 返回 0
SELECT ISNUMERIC('12.5') AS result; -- 返回 1
当表达式能够被转换为 int、decimal、float、money 等数值类型时,函数返回 1,否则返回 0。
容易被忽略的返回 1 的情况
ISNUMERIC 并不只认普通的阿拉伯数字,下面这些写法也会返回 1:
- 包含货币符号,如 '$100'、'¥200'
- 科学计数法,如 '1e3'
- 带有正负号,如 '+123'、'-45'
- 小数点和空格组合,如 ' 12 '(前后有空格)
因此,如果你只想判断是不是“纯数字字符串”,不能直接依赖 ISNUMERIC。
实际判断纯整数的写法
可以结合 LIKE 和 ISNUMERIC 来限制格式,例如判断某列 col 是否为纯正整数:
SELECT * FROM test_table WHERE ISNUMERIC(col) = 1 AND col NOT LIKE '%[^0-9]%';
上面语句中,col NOT LIKE '%[^0-9]%' 表示字符串中不能出现非数字字符,从而排除货币符号等情况。
判断是否为小数
若需要允许小数点,可以用如下方式:
SELECT * FROM test_table WHERE col LIKE '%[0-9]%' AND col NOT LIKE '%[^0-9.]%' AND col NOT LIKE '%.%.%';
这段逻辑保证只包含数字和至多一个小数点,且至少有一个数字,适合简单的小数格式校验。
与其他数据库的差异
需要注意,ISNUMERIC 是 SQL Server 特有的函数。在 MySQL 中可以使用 REGEXP 或 TRY_CAST,在 PostgreSQL 中可用 NULLIF 配合类型转换。如果做跨库开发,要针对具体数据库选择对应的判断方式。
小结
ISNUMERIC 能快速判断表达式是否可转数值,但因兼容货币、科学计数法等,不能等同于“纯数字判断”。在业务里建议配合 LIKE 或正则做更精确的限制,以避免脏数据进入数值计算逻辑。