MySQL如何通过多分隔符提取列中匹配指定值的分段内容
MySQL匹配指定值并返回对应分段的实现
假设你的表叫your_table,存目标字符串的列是target_column,要找的关键字是@keyword(直接换成具体值或者用变量都行)。
方法1:用REGEXP_SUBSTR(适合MySQL 8.0及以上)
直接用正则表达式匹配包含关键字的完整分段,一步到位:
SELECT REGEXP_SUBSTR(target_column, '[^|]*\\b' @keyword '\\b[^|]*') AS matched_segment FROM your_table WHERE target_column REGEXP '\\b' @keyword '\\b';
逻辑说明:
[^|]*:匹配所有不是|的字符,刚好能框住每个以|分隔的分段\\b:单词边界,防止把123误匹配成1234这种部分重叠的情况- 先通过
WHERE筛出包含关键字的行,再用REGEXP_SUBSTR把对应的分段提取出来
方法2:兼容老版本MySQL(低于8.0)
如果你的MySQL版本太老,没有REGEXP_SUBSTR函数,就用字符串截取的方式实现:
SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(target_column, '|', LOCATE(CONCAT('|', @keyword), CONCAT('|', target_column)) + 1 ), '|', -1 ) AS matched_segment FROM your_table WHERE target_column LIKE CONCAT('%', @keyword, '%');
逻辑说明:
- 先给字符串首尾加个
|,这样不管关键字在第一个还是最后一个分段,处理逻辑都一致 - 定位到关键字所在分段的位置,通过两次
SUBSTRING_INDEX把目标分段截出来
实际测试验证
拿你提供的列值举例:
761696495 - 689552180|723146573 - 684706476|295453556 - 656883782
不管查询684706476还是723146573,两种方法都会返回:
723146573 - 684706476
内容的提问来源于stack exchange,提问作者Shane
相关产品推荐
相关产品推荐

