2012-04-23 76 views
31

当搜索产品列表时,@SearchType参数是可选的。如果@SearchType为空或NULL那么它应该返回所有产品而不使用WHERE子句。否则,如果它通过Equipment它将使用它。SQL Server:检查WHERE子句中的变量是否为空或NULL

ALTER PROCEDURE [dbo].[psProducts] 
    (@SearchType varchar(50)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     P.[ProductId], 
     P.[ProductName], 
     P.[ProductPrice], 
     P.[Type] 
    FROM [Product] P 
    -- if @Searchtype is not null then use the where clause 
    WHERE p.[Type] = @SearchType 
END 

回答

81

只需使用

如果@searchType是空的意思是“返回整个表”,然后使用

WHERE p.[Type] = @SearchType OR @SearchType is NULL 

如果@searchType是一个空字符串意味着“返回整个表”,然后使用

WHERE p.[Type] = @SearchType OR @SearchType = '' 

如果@searchType为空或空字符串意味着“返回整个表”,然后使用

WHERE p.[Type] = @SearchType OR Coalesce(@SearchType,'') = '' 
+0

这是行不通的。当我传递参数时它不返回结果。产品页面查找类型的查询字符串,如果不是,则设置方法参数Type =“”。所以,我相信存储过程可能正在寻找一个SearchType =“”,它不会返回任何结果。我想返回所有结果。 – User970008 2012-04-23 16:16:03

+0

作品,谢谢! – User970008 2012-04-23 16:20:14

+0

它不工作,因为你传递一个空字符串。一个空字符串不是NULL! – 2012-04-23 16:20:26

5
WHERE p.[Type] = isnull(@SearchType, p.[Type]) 
+1

不起作用。往上看。它没有返回结果,我需要返回所有结果。 – User970008 2012-04-23 16:17:51

+4

它不工作,因为你传递一个空字符串。一个空字符串不是NULL! – 2012-04-23 16:20:14

+0

@AaronBertrand,它的工作原理。空串在哪里? – usefulBee 2018-01-03 18:49:17

14

如果你不想传递参数,当你不希望搜索,那么你应该做的参数可选,而不是假设''NULL是一样的。

ALTER PROCEDURE [dbo].[psProducts] 
(
    @SearchType varchar(50) = NULL 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT P.[ProductId] 
    ,P.[ProductName] 
    ,P.[ProductPrice] 
    ,P.[Type] 
    FROM dbo.[Product] AS P 
    WHERE p.[Type] = COALESCE(NULLIF(@SearchType, ''), p.[Type]); 
END 
GO 

现在,如果你通过NULL,一个空字符串(''),或离开了参数,where子句将基本上被忽略。

0

如果您可以使用一些动态查询,您可以使用LEN。它会对空字符串和空字符串赋予false。通过这种方式可以实现选项参数。

ALTER PROCEDURE [dbo].[psProducts] 
(@SearchType varchar(50)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

DECLARE @Query nvarchar(max) = N' 
    SELECT 
     P.[ProductId], 
     P.[ProductName], 
     P.[ProductPrice], 
     P.[Type] 
    FROM [Product] P' 
    -- if @Searchtype is not null then use the where clause 
    SET @Query = CASE WHEN LEN(@SearchType) > 0 THEN @Query + ' WHERE p.[Type] = ' + ''''+ @SearchType + '''' ELSE @Query END 

    EXECUTE sp_executesql @Query 
    PRINT @Query 
END 
0

老的文章,但值得一试的人谁像我绊倒在

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NOT NULL 

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NULL