SQL查询Where子句中如何对可为空的@id参数做ISNULL判断?
解决方案
问题原因
原有写法中,当@id参数为NULL时,传入自定义拆分函数dbo.Split通常会返回空结果集甚至直接抛出执行错误,最终导致查询无返回结果或运行异常。
修复代码
最常用的处理逻辑是:当@id为NULL时,直接跳过该ID筛选条件,仅在@id有有效值时才做ID匹配,利用SQL逻辑短路特性避免NULL传入拆分函数,修改后完整SQL如下:
SELECT PLIR.ListItemID AS [value], Item.ActiveFlag, Item.ListItemCode FROM ListItem AS [Item] INNER JOIN ListItemRelationship AS [PLIR] ON Item.ListItemID = PLIR.ListItemID WHERE Item.ListCode = @ListCode AND Item.ListItemLongValue LIKE ISNULL('%'+@mask+'%', NULL) AND (@id IS NULL OR Item.ListItemID IN (SELECT ITEMS FROM dbo.Split(@id, '|')))
兼容空字符串场景
如果业务中@id还可能传入空字符串''而非仅NULL,可以扩展判断条件:
AND (@id IS NULL OR @id = '' OR Item.ListItemID IN (SELECT ITEMS FROM dbo.Split(@id, '|')))
说明
- 该写法不需要修改原有
dbo.Split函数,兼容性高 - 如果你的业务逻辑要求
@id为NULL时匹配ID为空的记录,而非忽略筛选,替换OR前的判断条件即可
内容的提问来源于stack exchange,提问作者tRuEsAtM
相关产品推荐
相关产品推荐

