You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:25:55