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
等函数进一步优化。