我已经制作了一个SQL脚本,其中包含一堆If/else Blocks根据收到的数据进行工作。测试后,我注意到我已经忘记了" = null"在SQL中不起作用。是否有一个不错的方法来处理SQL脚本中可能的零值?
我的脚本曾经包含以下内容:
SET @PreviousFolderId = (
SELECT TOP(1) ObjectId
FROM Document.DocumentFolder
WHERE Name = @FolderName
AND ParentFolderId = @ParentFolderId
ORDER BY CreationDate
)
显然,如果@parentFolderId为null,这将无法使用。我想出的解决方法是以下(请不要笑(:
DECLARE @PreviousFolderIdTable TABLE (PreviousFolderId INT)
DECLARE @Query NVARCHAR(MAX)
SET @Query =
'SELECT TOP(1) ObjectId
FROM Document.DocumentFolder
WHERE Name = ''' + @FolderName + '''
AND ParentFolderId '
IF @ParentFolderId IS NULL
SET @Query += 'IS NULL'
ELSE SET @Query += CONCAT('= ',@ParentFolderId)
SET @Query += '
ORDER BY CreationDate'
DELETE FROM @PreviousFolderIdTable
INSERT INTO @PreviousFolderIdTable
EXECUTE(@Query)
SET @PreviousFolderId = (
SELECT TOP(1) PreviousFolderId
FROM @PreviousFolderIdTable
ORDER BY PreviousFolderId
)
必须有一种更好的方法来达到相同的效果。实现这一目标的不仅有太多的代码,而且有人要花一段时间才能理解我在这里要做的事情,而第一个查询很容易阅读。
如果要允许一个空的@ParentFolderId
,则可以在WHERE
中使用OR
:
WHERE Name = @FolderName
AND (@ParentFolderId IS NULL OR ParentFolderId = @ParentFolderId)
如果要处理NULL
作为正常值,则可以使用此
WHERE Name = @FolderName
AND (ParentFolder IS NULL AND @ParentFolderId IS NULL OR ParentFolderId = @ParentFolderId)