MySQL中如何不使用正则表达式筛选不含字母的字符串
筛选MySQL中不含字母的字符串(无正则方案)
嘿,这个问题挺有意思的——不用正则表达式(包括[^...]这类语法)来筛选不含字母的字符串,MySQL里确实有靠谱的办法,我给你两种实用方案:
方案一:多次REPLACE对比长度
核心思路是:把字符串里所有大小写字母都替换为空,如果替换后的字符串长度和原字符串长度一致,说明原字符串里没有字母(因为没替换掉任何内容)。
示例SQL代码:
SELECT STR FROM your_table WHERE LENGTH(STR) = LENGTH( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( STR, 'A', ''), 'B', ''), 'C', ''), 'D', ''), 'E', ''), 'F', ''), 'G', ''), 'H', ''), 'I', ''), 'J', ''), 'K', ''), 'L', ''), 'M', ''), 'N', ''), 'O', ''), 'P', ''), 'Q', ''), 'R', ''), 'S', ''), 'T', ''), 'U', ''), 'V', ''), 'W', ''), 'X', ''), 'Y', ''), 'Z', ''), 'a', ''), 'b', ''), 'c', ''), 'd', ''), 'e', ''), 'f', ''), 'g', ''), 'h', ''), 'i', ''), 'j', ''), 'k', ''), 'l', ''), 'm', ''), 'n', ''), 'o', ''), 'p', ''), 'q', ''), 'r', ''), 's', ''), 't', ''), 'u', ''), 'v', ''), 'w', ''), 'x', ''), 'y', ''), 'z', '' ) );
优点:写法直观,不需要依赖额外的表或MySQL版本;
缺点:需要手动写52次REPLACE(覆盖所有大小写字母),代码看起来有点冗长,适合短字符串场景。
方案二:逐个字符检查ASCII码
字母的ASCII范围是固定的:大写字母A-Z对应65-90,小写字母a-z对应97-122。我们可以逐个检查字符串里的每个字符,只要没有字符落在这两个范围内,就符合要求。
适合MySQL 8.0+(支持递归CTE)
先通过递归CTE生成一个数字序列,用来遍历字符串的每个字符位置:
WITH RECURSIVE nums AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM nums WHERE n < (SELECT MAX(LENGTH(STR)) FROM your_table) ) SELECT DISTINCT t.STR FROM your_table t WHERE NOT EXISTS ( SELECT 1 FROM nums WHERE nums.n <= LENGTH(t.STR) AND ( ASCII(SUBSTRING(t.STR, nums.n, 1)) BETWEEN 65 AND 90 OR ASCII(SUBSTRING(t.STR, nums.n, 1)) BETWEEN 97 AND 122 ) );
适合低版本MySQL(无递归CTE)
如果你的MySQL版本不支持递归CTE,可以提前创建一个数字表(比如存储1到最大字符串长度的数字),再用同样的逻辑查询:
-- 先创建数字表(假设最大字符串长度不超过100) CREATE TABLE nums (n INT PRIMARY KEY AUTO_INCREMENT); INSERT INTO nums VALUES (),(),(),(),(),(),(),(),(),(); -- 插入10行,重复直到n足够大 -- 然后查询 SELECT DISTINCT t.STR FROM your_table t WHERE NOT EXISTS ( SELECT 1 FROM nums WHERE nums.n <= LENGTH(t.STR) AND ( ASCII(SUBSTRING(t.STR, nums.n, 1)) BETWEEN 65 AND 90 OR ASCII(SUBSTRING(t.STR, nums.n, 1)) BETWEEN 97 AND 122 ) );
优点:代码更简洁,不需要写一堆REPLACE,适合长字符串场景;
缺点:需要生成数字序列,低版本MySQL要额外创建数字表。
两种方案都能完美避开正则表达式,你可以根据自己的MySQL版本和字符串长度情况选择~
内容的提问来源于stack exchange,提问作者Оля
相关产品推荐
相关产品推荐

