SSMS中如何优雅实现含NULL的唯一标识符Like过滤?
高效实现动态过滤kid字段的SELECT语句
首先纠正一个小问题:你声明变量时DECLARE @kid VARCHAR = '%'会导致截断,因为SQL Server中VARCHAR默认长度为1,必须指定为VARCHAR(36)(匹配UUID的36位长度),避免后续赋值具体UUID时丢失内容。
方案一:IF...ELSE分支(最直观高效)
这种方式将两种场景分开处理,能让SQL Server针对每种情况生成最优执行计划,充分利用字段索引:
DECLARE @kid VARCHAR(36) = '%'; -- 替换为具体UUID值即可 IF @kid = '%' BEGIN -- 返回所有记录(包含NULL) SELECT * FROM YourTableName; END ELSE BEGIN -- 仅匹配指定UUID的记录,可利用kid字段索引 SELECT * FROM YourTableName WHERE kid = @kid; END
优点:逻辑清晰,指定具体UUID时直接走索引查询,性能最优;全量查询时无额外过滤开销。
方案二:单语句逻辑判断(适合不想拆分语句的场景)
如果偏好单语句实现,可使用逻辑表达式避免对字段调用函数,从而保留索引可用性:
DECLARE @kid VARCHAR(36) = '%'; SELECT * FROM YourTableName WHERE (@kid = '%' OR kid = @kid) -- 可选:如果需要强制生成最优执行计划,添加RECOMPILE选项 OPTION(RECOMPILE);
补充说明:
- 当
@kid = '%'时,条件直接成立,返回所有记录(含NULL);当指定具体UUID时,仅匹配非NULL的对应记录,完全符合需求。 - 添加
OPTION(RECOMPILE)可以避免参数嗅探问题,让SQL Server根据@kid的实际值生成最优执行计划,尤其适合变量值频繁切换的场景。
为什么不推荐COALESCE的实现方式?
比如你之前可能用的WHERE COALESCE(kid, '') LIKE @kid,这种写法会对kid字段调用函数,导致该字段上的索引无法被使用,只能走全表扫描,数据量较大时性能会明显下降。上面的两种方案都避免了这个问题,在需要精准匹配时能高效利用索引。
内容的提问来源于stack exchange,提问作者user2532928
相关产品推荐
相关产品推荐

