如何在MySQL中设置数字通配符匹配前缀后接数字的编码?
问题描述
需要编写SQL脚本在两个不同数据库中查找编码,要求匹配以ABC开头且后续仅包含数字的编码(例如ABC108、ABC109)。尝试使用ABC[0-9]+作为参数,通过LIKE匹配时返回空结果,但使用ABC%能得到结果,需实现严格格式匹配。
尝试的SQL代码
SET @investment_code = 'ABC[0-9]+'; SELECT investment_name, i.service_client_id, currency_symbol, investment_code C_investment_codes FROM client.investments i LEFT JOIN client.currencies c ON i.currency_id = c.id WHERE i.investment_code COLLATE utf8mb4_unicode_ci LIKE @investment_code ORDER BY investment_code DESC LIMIT 1; SELECT `key`, service_client_id, `value` SD_investment_codes FROM client_data.standing_data sd WHERE sd.`value` COLLATE utf8mb4_unicode_ci LIKE @investment_code ORDER BY `value` DESC LIMIT 1;
问题原因
MySQL的LIKE运算符不支持正则表达式语法:
LIKE中的[0-9]仅匹配单个数字字符+在LIKE中被视为普通字符,而非"匹配一次或多次"的量词
因此ABC[0-9]+会被解析为匹配"ABC后接一个数字,再跟一个+号"的字符串,自然无法匹配目标编码。
解决方案
使用MySQL的REGEXP(或RLIKE)运算符实现正则匹配,同时调整参数为严格匹配规则:
^ABC:强制字符串以ABC开头[0-9]+:匹配一个或多个数字$:强制字符串以数字结尾,确保ABC后仅包含数字
修改后的SQL脚本如下(合并结果为预期的表格格式):
SET @investment_code = '^ABC[0-9]+$'; SELECT -- 获取client库中最新的匹配编码 (SELECT investment_code FROM client.investments WHERE investment_code REGEXP @investment_code ORDER BY investment_code DESC LIMIT 1) AS C_investment_codes, -- 获取client_data库中最新的匹配编码 (SELECT `value` FROM client_data.standing_data WHERE `value` REGEXP @investment_code ORDER BY `value` DESC LIMIT 1) AS SD_investment_codes;
如果需要保留原查询的其他字段,也可以分别查询后通过临时表或变量存储结果,再组合输出。
内容的提问来源于stack exchange,提问作者Odi
相关产品推荐
相关产品推荐

