搜索产品列表时,@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
答案 0 :(得分:88)
只需使用
如果@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,'') = ''
答案 1 :(得分:14)
如果您不想在不想搜索时传递参数,那么您应该将参数设为可选,而不是假设''
和NULL
是相同的。< / p>
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子句基本上会被忽略。
答案 2 :(得分:5)
WHERE p.[Type] = isnull(@SearchType, p.[Type])
答案 3 :(得分:0)
如果您可以使用某些动态查询,则可以使用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
答案 4 :(得分:0)
老帖但值得一看有人像我一样偶然发现
ISNULL(NULLIF(ColumnName, ' '), NULL) IS NOT NULL
ISNULL(NULLIF(ColumnName, ' '), NULL) IS NULL