web-dev-qa-db-fra.com

SQL Server: vérifie si la variable est vide ou NULL pour la clause WHERE

Lors de la recherche d'une liste de produits, le paramètre @SearchType est facultatif. Si @SearchType est vide ou NULL, il doit alors renvoyer tous les produits et ne pas utiliser la clause WHERE. Sinon, s'il passait Equipment, il l'utiliserait alors à la place.

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
32
User970008

Juste utiliser

Si @searchType est null, cela signifie 'renvoyer la table entière', utilisez

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

Si @searchType est une chaîne vide, cela signifie 'retourner la table entière', utilisez

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

Si @searchType est null ou qu'une chaîne vide signifie "renvoyer la table entière", utilisez

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

Si vous ne souhaitez pas transmettre le paramètre lorsque vous ne souhaitez pas effectuer de recherche, vous devez le rendre facultatif au lieu de supposer que '' et NULL sont identiques.

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

Maintenant, si vous passez NULL, une chaîne vide (''), ou si vous omettez le paramètre, la clause where sera essentiellement ignorée.

14
Aaron Bertrand
WHERE p.[Type] = isnull(@SearchType, p.[Type])
5
RedFilter

Si vous pouvez utiliser une requête dynamique, vous pouvez utiliser LEN. Il donnera false sur les chaînes vides et nulles. De cette manière, vous pouvez implémenter le paramètre option.

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
Ali Umair

Ancien post mais qui vaut le coup d'oeil pour quelqu'un qui trébuche comme moi 

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

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