我确信这有一个非常简单的答案我没有找到...我在数据库中有一个简单的层次结构,其中每一行都有一个ParentId。如果ParentId IS NULL
,则它是根元素。我有存储过程:
CREATE PROCEDURE GetByParent @parentId int
AS BEGIN SELECT * FROM TABLE1 WHERE ParentId = @parentId END
如果我发送一个整数,它工作正常,但如果我发送NULL
它变为ParentId = NULL
,这在ANSI中不起作用。我知道有COALESCE(@parentId, ParentId)
,但在@parentId IS NULL
时会返回所有行。我可以执行IF ELSE语句并复制查询(一个使用= @parentId
,另一个使用IS NULL
),但我确信有更好的方法。
答案 0 :(得分:6)
在单独的条件下处理NULL情况:
SELECT *
FROM TABLE1
WHERE ParentId = @parentId
OR (ParentId IS NULL AND @parentId IS NULL)
答案 1 :(得分:3)
实际上,IF / ELSE方法是使用动态SQL的最佳性能。假设SQL Server 2005+,您将使用:
DECLARE @SQL NVARCHAR(max)
SET @SQL = 'SELECT * FROM TABLE1 WHERE 1=1 '
SET @SQL = CASE
WHEN @parentid IS NULL THEN ' AND parentid IS NULL '
ELSE ' AND parentid = @parentid '
END
BEGIN
EXEC sp_executesql @SQL, N'parentid INT', @parentid
END
强制性IF / ELSE:
BEGIN
IF @parentid IS NULL
BEGIN
SELECT * FROM TABLE1 WHERE parentid IS NULL
END
ELSE
BEGIN
SELECT * FROM TABLE1 WHERE parentid = @parentid
END
END
答案 2 :(得分:3)
我假设您没有对parentID使用否定ID。
如果您使用两个ISNULL语句,则可以在一个查询中涵盖所有案例:
SELECT * FROM TABLE1 WHERE ISNULL(ParentId,-1) = ISNULL(@parentId,-1)
这种方式当@parentid为NULL时,它只返回空值而不是所有行的结果。
答案 3 :(得分:1)
你可以使用OR语句
...
WHERE (@parentId IS NULL AND ParentId IS NULL) OR ParentId=@parentId