如何用SQL LIKE匹配字符串中的A1至A20格式内容?
匹配TEST表中QUESTION字段包含A1-A20的SQL解决方案
问题分析
你原来的%A[1-9][2-0]%语句无效,原因有两点:
- 该模式要求A后必须跟两个字符,漏掉了A1-A9这类单数字后缀的内容;
- 字符范围
[2-0]不符合ASCII顺序(2的编码大于0),实际是无效范围,无法匹配0-9的数字。
可行解决方案
方案1:用LIKE+OR组合精准匹配
通过拆分匹配规则,覆盖A1-A9、A10-A19、A20三个区间:
SELECT * FROM TEST WHERE QUESTION LIKE '%A[1-9]%' OR QUESTION LIKE '%A1[0-9]%' OR QUESTION LIKE '%A20%';
%A[1-9]%:匹配A1到A9%A1[0-9]%:匹配A10到A19%A20%:单独匹配A20
方案2:用正则表达式(支持正则的数据库)
如果你的数据库支持正则(如MySQL、PostgreSQL、SQL Server 2017+),可以用更简洁的正则表达式直接匹配目标范围:
-- MySQL/PostgreSQL 示例 SELECT * FROM TEST WHERE QUESTION REGEXP 'A(1[0-9]|[1-9]|20)';
-- SQL Server 2017+ 示例 SELECT * FROM TEST WHERE REGEXP_LIKE(QUESTION, 'A(1[0-9]|[1-9]|20)');
正则表达式说明:A(1[0-9]|[1-9]|20) 匹配以下三种情况:
A1[0-9]:A10到A19A[1-9]:A1到A9A20:精确匹配A20
注意事项
- 避免使用
%A[0-9]%或%A[0-9][0-9]%这类宽泛模式,会误匹配A0、A21、A100等超出范围的内容; - 如果需要确保匹配的是独立的A+数字(比如不匹配
XA1或A1B),可以在正则中添加边界匹配,比如\bA(1[0-9]|[1-9]|20)\b(具体语法根据数据库调整)。
内容的提问来源于stack exchange,提问作者TechApp
相关产品推荐
相关产品推荐

