SQL查询根据@CategoryId参数条件筛选返回匹配记录的实现方案求解
正确SQL实现方案
SELECT TOP (@NoofQuestion) * FROM tblQuestion qs WHERE qs.IsActive = 1 AND qs.IsDeleted = 0 AND (@CategoryId IS NULL OR qs.CategoryID = @CategoryId) ORDER BY NEWID()
注意:你原有代码里TOP后的参数名拼写错误,已修正为
@NoofQuestion和你描述的参数名保持一致。
逻辑说明
- 基础有效条件
IsActive = 1、IsDeleted = 0为所有场景必填,使用AND连接保证始终生效 - 分类筛选逻辑用括号包裹保证运算优先级:
- 当入参
@CategoryId为NULL时,@CategoryId IS NULL判断结果为真,整个分类条件整体为真,不会额外限制分类ID,返回所有符合基础规则的记录 - 当入参
@CategoryId为具体值时,@CategoryId IS NULL判断为假,SQL会执行qs.CategoryID = @CategoryId匹配判断,仅返回分类ID和入参一致的有效记录
- 当入参
可选性能优化建议
如果表数据量较大,且在(IsActive, IsDeleted, CategoryID)上建有联合索引,可以在SQL末尾加上OPTION(RECOMPILE),避免参数嗅探导致执行计划选错,提升查询效率:
SELECT TOP (@NoofQuestion) * FROM tblQuestion qs WHERE qs.IsActive = 1 AND qs.IsDeleted = 0 AND (@CategoryId IS NULL OR qs.CategoryID = @CategoryId) ORDER BY NEWID() OPTION(RECOMPILE)
内容的提问来源于stack exchange,提问作者Allah Ditta
相关产品推荐
相关产品推荐

