MySQL查询:如何从SUBSTRING结果中仅提取数字部分?
解决方案:提取子串中的数字部分
我来帮你搞定这个数字提取的需求!你的原查询已经成功筛选出了包含[table的已发布帖子,并截取了从[table开始的16个字符,现在只需要在这个基础上,精准提取出子串里的纯数字部分即可。根据你的MySQL版本,有两种实用的实现方式:
方式1:MySQL 8.0及以上版本(推荐)
MySQL 8.0+自带的REGEXP_SUBSTR函数可以直接用正则匹配提取连续数字,写法简洁高效:
SELECT REGEXP_SUBSTR(SUBSTRING(post_content, INSTR(post_content, '[table'), 16), '[0-9]+') AS substring, ID FROM `wp276_posts` WHERE `post_content` LIKE '%[table%' AND `post_status` = 'publish' ORDER BY `ID` ASC;
简单解释:
REGEXP_SUBSTR(目标字符串, '[0-9]+')会自动从截取到的子串里,匹配并返回第一个连续的数字序列,完美契合你要的“仅保留数字”的需求。- 哪怕子串里有其他字符干扰(比如
[table_22或[table-67这类格式),这个正则依然能准确抓出数字部分。
方式2:MySQL 5.x版本(兼容旧版本)
如果你还在使用MySQL 5.x(没有REGEXP_SUBSTR函数),可以用SUBSTRING结合REGEXP_INSTR组合实现:
SELECT SUBSTRING( SUBSTRING(post_content, INSTR(post_content, '[table'), 16), REGEXP_INSTR(SUBSTRING(post_content, INSTR(post_content, '[table'), 16), '[0-9]'), LENGTH(SUBSTRING(post_content, INSTR(post_content, '[table'), 16)) - REGEXP_INSTR(SUBSTRING(post_content, INSTR(post_content, '[table'), 16), '[0-9]') + 1 ) AS substring, ID FROM `wp276_posts` WHERE `post_content` LIKE '%[table%' AND `post_status` = 'publish' ORDER BY `ID` ASC;
简单解释:
REGEXP_INSTR(目标字符串, '[0-9]')先定位到子串中第一个数字的位置,再用SUBSTRING从这个位置开始截取到子串末尾,最终得到纯数字内容。
两种方式都能输出你期望的结果:
+-----------+------+ | substring | ID | +-----------+------+ | 22 | 5072 | +-----------+------+ | 67 | 5757 | +-----------+------+ | 54 | 8550 | +-----------+------+
内容的提问来源于stack exchange,提问作者Dudo1985
相关产品推荐
相关产品推荐

