sql server中判断纯数字最稳写法是patindex('%1%', col) = 0 and isnumeric(col) = 1 and len(trim(col)) > 0,既排除非数字字符和伪数字,又过滤空值与空白;mysql/postgresql则须用^$锚定首尾,如col regexp '^[0-9]+$'或col ~ '^[0-9]+$'。0-9 ↩

直接用 PATINDEX('%[^0-9]%', col) = 0 AND ISNUMERIC(col) = 1 是 SQL Server 里最稳的写法;MySQL/PostgreSQL 则优先用正则锚定首尾,比如 col REGEXP '^[0-9]+$'。
SQL Server 怎么写才不漏数据
只靠 ISNUMERIC() 不行——它会把 '123.'、'1e4'、'+' 甚至空格都判为数字;只靠 PATINDEX('%[^0-9]%', col) = 0 也不行——它放过空字符串和纯空白(如 ' ')。
- 必须组合判断:
PATINDEX('%[^0-9]%', col) = 0确保无非数字字符,ISNUMERIC(col) = 1排除科学计数法等伪数字,再加col != ''和LEN(TRIM(col)) > 0剔除空值和空白 - 排序规则影响大小写敏感性,但
[^0-9]只匹配非数字,不受大小写影响 - 如果字段含前导/后缀空格,先
TRIM(col)再判断,否则' 123 '会被PATINDEX判为含空格(即非数字)而过滤掉
MySQL 和 PostgreSQL 用正则怎么锚定“整个字段”
REGEXP '[0-9]' 或 ~ '[0-9]' 是子串匹配,会把 'abc123' 也拉进来;要“纯数字”,必须用 ^ 和 $ 锚定首尾。
- MySQL 正确写法:
col REGEXP '^[0-9]+$'(+表示至少一个数字,*会匹配空字符串) - PostgreSQL 正确写法:
col ~ '^[0-9]+$';若需忽略大小写(虽然对数字无效),可用~*,但这里没必要 - MySQL 5.7 不支持
\d,必须写[0-9];8.0+ 支持\d,语义等价,但可读性略差 - 注意 NULL:正则对 NULL 返回 NULL,整行被 WHERE 过滤,所以必要时补
AND col IS NOT NULL
为什么不能只用 LIKE
LIKE '[0-9]' 在所有主流数据库中都不合法——LIKE 不支持方括号内的字符类取反或范围语法;LIKE '%[0-9]%' 会被当字面量匹配 '['、'0'、'-'、'9'、']' 这五个字符。
- SQL Server 的
LIKE只认%、_、[charlist](需配合ESCAPE才能表达特殊含义),但无法表达“仅由某类字符组成” - 有人试
NOT (col LIKE '%a%' OR col LIKE '%b%' ...)枚举所有非数字字符,既不可维护,又漏 Unicode 字符(如中文、emoji) - 真正需要“纯数字”的场景,基本都意味着后续要转成数值计算,这时候用
ISNUMERIC()+PATINDEX()组合,比硬套LIKE更贴近业务意图
实际执行前务必确认字段是否允许 NULL、是否有前后空格、是否定义了非默认排序规则——这些细节不处理,^[0-9]+$ 和 PATINDEX 都可能在边界 case 上静默失效。










