如何在MariaDB/MySQL中提取字符串‘-’与‘/’之间的数字?
在MariaDB中提取字符串中'-'和'/'之间的数字
你需要提取code字段中最后一个'-'之后、第一个'/'之前的数字,之前的查询失败是因为错误地用空格作为分割符,但你的code字段里没有空格,导致INSTR(code, ' ')返回0,SUBSTR截取了空内容。
以下是两种可行的解决方案:
方法一:使用字符串函数组合
通过定位最后一个'-'和第一个'/'的位置,直接截取目标数字:
SELECT id, product, code, SUBSTRING( code, -- 计算最后一个'-'的下一个字符位置 LENGTH(code) - INSTR(REVERSE(code), '-') + 2, -- 计算需要截取的长度:'/'的位置 - 起始位置 INSTR(code, '/') - (LENGTH(code) - INSTR(REVERSE(code), '-') + 2) ) AS output FROM products ORDER BY CAST(output AS UNSIGNED) ASC;
说明:
INSTR(REVERSE(code), '-'):反向查找第一个'-'的位置,对应原字符串的最后一个'-'LENGTH(code) - 反向位置 +1:得到原字符串中最后一个'-'的索引,加2就是从'-'后第一个字符开始截取INSTR(code, '/'):找到第一个'/'的位置,两者的差值就是需要截取的长度
方法二:使用正则表达式替换
利用REGEXP_REPLACE直接匹配并提取目标数字,更简洁:
SELECT id, product, code, REGEXP_REPLACE(code, '^.*-(\\d+)/.*$', '\\1') AS output FROM products ORDER BY CAST(output AS UNSIGNED) ASC;
说明:
^.*-:贪婪匹配从字符串开头到最后一个'-'的所有内容(\\d+):捕获'-'后到'/'前的所有数字(括号是捕获组)/.*$:匹配'/'到字符串结尾的所有内容- 替换为
\\1:保留捕获组中的数字,丢弃其他内容
内容的提问来源于stack exchange,提问作者Elo
相关产品推荐
相关产品推荐

