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且下一个字符不是W
   OR 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 等函数进一步优化。

相关推荐
努力进修17 小时前
“数据心脏” 驱动能源自主:国产数据库支撑 Cemsol 实现固井全流程数字化闭环
数据库·人工智能·能源
vHelios17 小时前
SQL不会写?不会找关联表?复杂SQL语句编写逻辑实现思路请查收✉
数据库·sql
DB哥讲数据库18 小时前
【ClickHouse安装教程】从零开始部署高性能列式数据库(附ClickHouse安装包)
数据库·clickhouse
TDengine (老段)18 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
小白勇闯网安圈1 天前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
努力的小雨1 天前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图1 天前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl1 天前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl1 天前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl1 天前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库