SQL 使用可空参数的 case 表达式

SQL case expression using nullable parameters

我向我的存储过程传递了一个参数列表,其中一些可以为空。

根据传递的值,我需要创建一个 where 子句;我想做的是,如果@productType 不为空,那么 WHERE PmTyId = @productType ELSE 不要将它添加到 where 子句中。

如何实现?

WHERE 
        CASE
            WHEN @productType IS NOT NULL THEN PmTyId = @productType
        END 

我会这样做。括在括号中将允许您在 WHERE 子句中添加更多内容;

好的,测试数据;

IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData
GO
CREATE TABLE #TestData (IDField int, PmTyId varchar(20))
INSERT INTO #TestData (IDField, PmTyId)
VALUES
(1,'include')
,(2,'include')
,(3,'dont include')

我的查询;

DECLARE @productType varchar(20); SET @productType = 'include'

SELECT
IDField
,PmTyId
FROM #TestData
WHERE (@productType IS NULL OR @productType = PmTyId)

输出;

IDField PmTyId
1       include
2       include

如果@productType 设置为 null 那么您会得到这些结果;

IDField PmTyId
1       include
2       include
3       dont include

如果您需要添加更多参数,请执行以下操作;

SELECT
IDField
,PmTyId
FROM #TestData
WHERE (@productType IS NULL OR @productType = PmTyId)
OR (@Parameter2 IS NULL OR @Parameter2 = Field2)
OR (@Parameter3 IS NULL OR @Parameter3 = Field3)

通常您不会在 where 子句中使用 case。你可以用简单的布尔逻辑解决这个问题

WHERE (@productType IS NULL OR PmTyId = @productType)

一个选项:

WHERE ISNULL(@productType, PmTyId) = PmTyId