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
Ответы
Ответ 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