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
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,'') = ''
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é.
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
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