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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:40:12