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

如何筛选仅以指定前缀开头的字符串?SQL多前缀筛选查询优化方法咨询

问题分析与解决方案

首先得指出你当前SQL语句的核心问题:你用了AND连接多个LIKE条件,但一个字符串不可能同时以AC、AY、AN等多个前缀开头,这样的查询永远不会返回任何结果,你需要把AND换成OR才行。

接下来给你几种更简洁的实现方式,适配不同的场景:

1. 改进版LIKE条件(兼容性最强)

这是最直观且所有SQL数据库都支持的写法,把AND替换为OR即可:

SELECT PN 
FROM MyTestTable 
WHERE PN LIKE 'AC%' 
   OR PN LIKE 'AY%' 
   OR PN LIKE 'AN%' 
   OR PN LIKE 'AZ%' 
   OR PN LIKE 'IR%'; -- 注意你原语句里的'IR %'(带空格),如果是要匹配以"IR "开头的字符串,保留空格即可;如果是笔误,去掉空格

2. 使用LEFT函数+IN子句(前缀长度统一时更简洁)

如果你的目标前缀都是固定长度(比如AC/AY/AN/AZ/IR都是2个字符),可以用LEFT函数提取字符串前2位,再用IN匹配目标前缀列表,写法更简洁:

SELECT PN 
FROM MyTestTable 
WHERE LEFT(PN, 2) IN ('AC', 'AY', 'AN', 'AZ', 'IR');

如果IR需要带空格(即前缀是3个字符"IR "),可以调整逻辑,比如:

SELECT PN 
FROM MyTestTable 
WHERE LEFT(PN, 2) IN ('AC', 'AY', 'AN', 'AZ')
   OR LEFT(PN, 3) = 'IR ';

3. 正则表达式(复杂匹配场景更灵活)

如果你的数据库支持正则表达式,这种写法最简洁,尤其是前缀规则复杂时:

  • MySQL/MariaDB:
SELECT PN 
FROM MyTestTable 
WHERE PN REGEXP '^(AC|AY|AN|AZ|IR)';
  • PostgreSQL:
SELECT PN 
FROM MyTestTable 
WHERE PN ~ '^(AC|AY|AN|AZ|IR)';
  • SQL Server:
SELECT PN 
FROM MyTestTable 
WHERE PATINDEX('^(AC|AY|AN|AZ|IR)%', PN) > 0;

如果要匹配带空格的"IR "前缀,把正则里的IR改成IR 即可。

每种方法的小提示:

  • 第一种方法兼容性拉满,适合所有数据库,没有语法差异;
  • 第二种方法性能通常不错,尤其是当PN字段有索引时,LEFT(PN,2)可以利用前缀索引;
  • 第三种方法最灵活,但注意不同数据库的正则语法略有区别,需要对应调整。

内容的提问来源于stack exchange,提问作者user15973370

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:32:48