SQL Server:检查变量是否为空或WHERE子句为NULL

时间:2012-04-23 16:09:18

标签: sql sql-server if-statement where-clause

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

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

5 个答案:

答案 0 :(得分:88)

只需使用

如果@searchType为null意味着'返回整个表',则使用

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

如果@searchType为空字符串,则表示“返回整个表格”,然后使用

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

如果@searchType为null或空字符串表示'返回整个表',则使用

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

答案 1 :(得分:14)

如果您不想在不想搜索时传递参数,那么您应该将参数设为可选,而不是假设''NULL是相同的。< / p>

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子句基本上会被忽略。

答案 2 :(得分:5)

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

答案 3 :(得分: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

答案 4 :(得分:0)

老帖但值得一看有人像我一样偶然发现

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

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