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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:54:03