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

Lors de la recherche d'une liste de produits, le @SearchType paramètre est facultatif. Si {[1] } est vide ou NULL, il doit renvoyer tous les produits et ne pas utiliser la clause WHERE. Sinon, s'il passait Equipment, il l'utiliserait à 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
31
demandé sur User970008 2012-04-23 20:09:17

5 réponses

Il suffit d'utiliser

Si @searchType est null signifie "retourner la table entière", utilisez

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

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

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

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

WHERE p.[Type] = @SearchType OR Coalesce(@SearchType,'') = ''
86
répondu Phil 2012-04-23 16:18:51

Si vous ne voulez pas passer le paramètre lorsque vous ne voulez pas rechercher, vous devez rendre le paramètre facultatif au lieu de supposer que '' et NULL sont la même chose.

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 de laisser le paramètre, la clause where sera essentiellement ignoré.

14
répondu Aaron Bertrand 2012-04-23 16:19:33
WHERE p.[Type] = isnull(@SearchType, p.[Type])
5
répondu RedFilter 2012-04-23 16:12:41

Si vous pouvez utiliser une requête dynamique, vous pouvez utiliser LEN . Il donnera false sur les chaînes vide et null. De cette façon, 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
répondu Ali Umair 2015-10-19 07:26:58

Ancien poste, mais vaut le coup d'oeil pour quelqu'un qui tombe sur moi comme

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

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NULL
0
répondu singhswat 2016-09-22 11:55:42