Подтвердить что ты не робот

SQL Server: проверьте, является ли переменная пустой или NULL для предложения WHERE

При поиске списка продуктов параметр @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
4b9b3361

Ответ 1

Просто используйте

Если @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,'') = ''

Ответ 2

Если вы не хотите передавать параметр, когда вы не хотите искать, то вы должны сделать параметр необязательным, вместо того, чтобы предполагать, что '' и 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 будет по существу игнорироваться.

Ответ 3

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

Ответ 4

Если вы можете использовать какой-либо динамический запрос, вы можете использовать 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

Ответ 5

Старый пост, но стоит посмотреть на кого-то, кто натыкается на меня.

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

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