MySQL查询:筛选ABC列含至少3个≥5数字的字符串行
MySQL查询:筛选包含至少3个≥5数字的分隔字符串行
适用于MySQL 8.0及以上版本(推荐方案)
利用JSON_TABLE函数将分隔字符串拆分为独立行,统计符合条件的数字数量后筛选:
SELECT t.* FROM your_table t INNER JOIN ( SELECT id, -- 替换为你的表的主键/唯一标识列 COUNT(*) AS qualified_count FROM your_table INNER JOIN JSON_TABLE( -- 将~分隔的字符串转换为合法JSON数组 CONCAT('["', REPLACE(ABC, '~', '","'), '"]'), '$[*]' COLUMNS(num INT PATH '$') ) AS split_nums WHERE split_nums.num >= 5 GROUP BY id HAVING qualified_count >= 3 ) AS count_result ON t.id = count_result.id;
说明:
- 将
your_table替换为你的实际表名,id替换为表的主键或唯一标识列(确保能唯一识别每一行) REPLACE和CONCAT组合将8~1~0~1~0~0~2~0~5~6这类字符串转换为["8","1","0","1","0","0","2","0","5","6"]格式的JSON数组JSON_TABLE将数组拆分为多行,每行对应一个数字,随后筛选出≥5的数字并按原行分组统计数量- 最后关联原表,只保留统计数量≥3的行
适用于MySQL 5.x版本(无JSON_TABLE支持)
如果无法升级到8.0,可以使用字符串匹配结合计数的方式(注意:此方法需确保数字为0-100的整数):
SELECT * FROM your_table WHERE -- 统计开头的数字是否符合条件 IF(LOCATE('~', ABC) = 0, ABC + 0 >=5, LEFT(ABC, LOCATE('~', ABC)-1) + 0 >=5) + -- 统计中间的~X~格式中X≥5的数量 (LENGTH(ABC) - LENGTH(REGEXP_REPLACE(ABC, '~([5-9]|[1-9][0-9]|100)~', '~'))) / LENGTH('~([5-9]|[1-9][0-9]|100)~') + -- 统计结尾的数字是否符合条件 IF(LOCATE('~', ABC) = 0, 0, RIGHT(ABC, LENGTH(ABC) - LOCATE('~', REVERSE(ABC)) + 1) + 0 >=5) >= 3;
说明:
- 正则
~([5-9]|[1-9][0-9]|100)~匹配中间位置的≥5的数字(包含5-9、10-99、100) - 通过计算替换前后的长度差,得到中间符合条件的数字数量
- 单独处理开头和结尾的数字,避免边界匹配问题
内容的提问来源于stack exchange,提问作者sshanmugagani
相关产品推荐
相关产品推荐

