当前位置: 首页 > news >正文

sql中like and not like的优化

select * from ChkRepItemTaskOfSamle 
where Rvt_ApplyID like '%XG%' and Rvt_ApplyID not like '%XGW%'

优化方案 1:使用 PATINDEX 函数(推荐)

sql

复制

下载

SELECT * 
FROM ChkRepItemTaskOfSamle 
WHERE PATINDEX('%XG[^W]%', Rvt_ApplyID) > 0   -- 包含XG且下一个字符不是WOR PATINDEX('%XG', Rvt_ApplyID) > 0;       -- 处理XG在末尾的情况

优化方案 2:使用 CHARINDEX 组合

sql

复制

下载

SELECT * 
FROM ChkRepItemTaskOfSamle 
WHERE CHARINDEX('XG', Rvt_ApplyID) > 0 AND CHARINDEX('XGW', Rvt_ApplyID) = 0;

优化方案 3:添加计算列 + 索引(大数据量适用)

sql

复制

下载

-- 1. 添加持久化计算列
ALTER TABLE ChkRepItemTaskOfSamle
ADD IsTarget AS CAST(CASE WHEN Rvt_ApplyID LIKE '%XG%' AND Rvt_ApplyID NOT LIKE '%XGW%' THEN 1 ELSE 0 END AS BIT
) PERSISTED;-- 2. 创建索引
CREATE INDEX IX_TargetFilter ON ChkRepItemTaskOfSamle(IsTarget);-- 3. 查询时使用
SELECT * 
FROM ChkRepItemTaskOfSamle 
WHERE IsTarget = 1;

性能对比说明:

方法优点缺点适用场景
原始双LIKE简单直观性能较差(两次全列扫描)小数据量
PATINDEX单次扫描,性能较好语法稍复杂中等数据量
CHARINDEX组合函数效率高于LIKE仍需两次扫描通用场景
计算列+索引大数据量极快需要修改表结构,维护成本高百万级以上数据频繁查询

推荐选择:

  • 中等数据量:优先使用 PATINDEX 方案(方案1),它在保持单次扫描的同时更精确

  • 超大数据量:采用计算列+索引方案(方案3),但需权衡维护成本

  • 兼容性要求高:使用 CHARINDEX 组合(方案2)

注意:如果 Rvt_ApplyID 字段已建立索引,建议测试实际执行计划选择最优方案。在 SQL Server 2016+ 版本中,还可考虑使用 STRING_SPLIT 等函数进一步优化。

相关文章:

  • Web后端基础:数据库
  • 【1】Redis 缓存穿透原理和解决方案
  • 操作系统核心名词解释--期末简答题快速复习
  • 【深度解析】Java高级并发模式与实践:从ThreadLocal到无锁编程,全面避坑指南!
  • Python 训练营打卡 Day 46-通道注意力
  • 电影院管理系统的设计与实现
  • VINS-Fusion 简介、安装、编译、数据集/相机实测
  • Linux系统编程 | IPC对象---共享内存
  • 算法的几大模块
  • HTML 从入门到起飞 · 系列合集:一站式学习不掉线
  • htmlcss考核
  • 6.11小测(html、css)
  • [深度学习]目标检测基础
  • RADIUS服务器的核心应用场景与ASP认证服务器的快速对接指南
  • MIT线性代数第二讲笔记
  • docker(学习笔记第一课) 使用nginx +https + wordpress
  • 视觉通才模型:最新综述 [ 2025 IJCV ]
  • AI for 数据分析:技术演进与应用实践
  • Flink CDC MySQL 表字段定义为 decimal 输出乱码问题优雅解决方式
  • logback常用配置