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
我向我的存储过程传递了一个参数列表,其中一些可以为空。
根据传递的值,我需要创建一个 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