Sql 如果参数为null,则返回null值,否则返回参数的特定值

Sql 如果参数为null,则返回null值,否则返回参数的特定值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在创建一个存储过程,其中如果输入参数的值为Null,我必须在“Color”列中返回Null值,如果输入参数为,比如说,“Blue”,我必须返回值为“Blue”的“Color”列。这是我的sql代码: Create Proc Reports.GetProductsByColor @Color nvarchar(20) AS SET NOCOUNT ON SET ANSI_NULLS OFF BEGIN Select SalesLT.Product.ProductID as ProductID,

我正在创建一个存储过程,其中如果输入参数的值为Null,我必须在“Color”列中返回Null值,如果输入参数为,比如说,“Blue”,我必须返回值为“Blue”的“Color”列。这是我的sql代码:

Create Proc Reports.GetProductsByColor @Color nvarchar(20)
AS
SET NOCOUNT ON
SET ANSI_NULLS OFF
BEGIN
Select SalesLT.Product.ProductID as ProductID,
       SalesLT.Product.Name as 'Name',
       SalesLT.Product.ListPrice as Price,
       SalesLT.Product.Color as Color,
       SalesLT.Product.Size as Size
From   SalesLT.Product
Where  Color = CASE WHEN @Color is NULL
               THEN NULL
               ELSE @Color
               END
END
GO
Exec Reports.GetProductsByColor 'Blue'
GO
Exec Reports.GetProductsByColor NULL
GO

Exec Reports.GetProductsByColor“蓝色”
工作正常,只显示“蓝色”值。但是,对于
Exec Reports.GetProductsByColor NULL
,即使“Color”列中有50个空值,我也不会得到任何结果集。我做错了什么?如有任何反馈,将不胜感激。谢谢:D

因为
null=null
返回的
false
不起作用。使用

Where (@Color is NULL and Color is null)
   or (@color = color)

因为
null=null
返回不起作用的
false
。使用

Where (@Color is NULL and Color is null)
   or (@color = color)
试试这个:

where ISNULL(Color,'-') =IsNUll(@Color,'-') 
请注意,以下WHERE子句不是SARG,如果可用,将不会使用颜色列的关联索引

要解决SARG问题,您需要使用

尝试以下方法:

where ISNULL(Color,'-') =IsNUll(@Color,'-') 
请注意,以下WHERE子句不是SARG,如果可用,将不会使用颜色列的关联索引


要解决特区政府的问题,您需要使用

@juergend是的,我在回答中提到了这个性能问题,这就是为什么我提到您的性能回答improvement@juergend对我在回答中提到了这个性能问题,这就是为什么我引用了您的性能回答improvement@PinkPrint如果答案解决了你的问题,你应该接受它,这样其他人就会知道问题已经解决。@PinkPrint如果答案解决了你的问题,你应该接受它,这样其他人就会知道知道问题已经解决了。