如何在T-SQL的LIKE子句中指定零个或多个重复字符组?
解决LIKE模式匹配中重复字符组的问题
首先明确:标准SQL的LIKE语法不支持正则式的量词(+/*/{n}),它的通配符只有两个:
%:匹配任意长度(含0)的任意字符序列_:匹配单个任意字符
而[字符类]仅能匹配单个属于该类的字符,无法直接让这个字符组重复多次。下面分场景给出解决方案:
1. 必须使用LIKE的情况(无正则扩展)
要匹配仅由数字和逗号组成、且至少出现一次的字符串,可以结合NOT LIKE排除非法字符,同时确保字符串非空:
WHERE column_name NOT LIKE '%[^0-9,]%' AND column_name <> ''
注:[^0-9,]是“否定字符类”,表示匹配不属于数字或逗号的字符,这个写法适用于SQL Server;MySQL的LIKE不支持该语法,需改用正则方案。
2. 更简洁的正则匹配方案(推荐)
现代数据库几乎都支持原生正则匹配,这是处理重复字符组需求的最优解:
- MySQL/MariaDB:用
REGEXP或RLIKEWHERE column_name REGEXP '^[0-9,]+$' - PostgreSQL:用
~操作符或SIMILAR TO-- 方式1:~ 操作符 WHERE column_name ~ '^[0-9,]+$' -- 方式2:SIMILAR TO(SQL标准正则扩展) WHERE column_name SIMILAR TO '([0-9,])+' - SQL Server(2016+):用
REGEXP_LIKEWHERE REGEXP_LIKE(column_name, '^[0-9,]+$') - Oracle:用
REGEXP_LIKEWHERE REGEXP_LIKE(column_name, '^[0-9,]+$')
为什么你的尝试没生效?
你之前用的[0-9,]只能匹配单个数字或逗号;而[0-9,]*在LIKE语法里不表示重复字符组——因为LIKE不把*当作量词,这里的*会被当作字面量字符处理,实际匹配的是“单个数字/逗号+一个*字符”,自然达不到预期效果。
内容的提问来源于stack exchange,提问作者Mark Roworth
相关产品推荐
相关产品推荐

