有一个表类别(ID,标题,描述,parentID,friendlyUrl,categoryTypeID)。 字段值parentID可以为null。
如果@ParentID = null,如何选择仅 parentID = null的行。
declare @ID int =null
declare @FriendlyUrl nvarchar(30) = null
declare @ParentID int = null
declare @CategoryTypeID int = 0
select * from Category
where
(@ID is null or ID = @ID)
and (@FriendlyUrl is null or FriendlyUrl=@FriendlyUrl)
and (@ParentID is null or ParentID=@ParentID)
and (@CategoryTypeID is null or CategoryTypeID=@CategoryTypeID)
如果@ParentID =指定的int值(它是正确的),此查询将选择所有具有parentID = @ ParentID的行。
但是如果@ParentID = null,它会选择所有行(它不对)。
答案 0 :(得分:4)
您的错误在这里:
and (@ParentID is null or ParentID=@ParentID)
当@ParentID == null时,该等式的第一部分为真,并且由于OR语句,布尔逻辑的第二部分不再重要并被忽略。
这就是AdaTheDev的答案适用于@ID For @ParentID的原因:
and ((@ParentID is null AND ParentID is null) or (@ParentID not is null AND ParentID = @parentID))
答案 1 :(得分:1)
这个怎么样......或者我没有正确理解你的问题?
select * from Category
where (@ID is null or ID = @ID)
and (@FriendlyUrl is null or FriendlyUrl=@FriendlyUrl)
and (NOT(@ParentID is null) or ParentID=@ParentID) ' added NOT here
and (@CategoryTypeID is null or CategoryTypeID=@CategoryTypeID)