2014-07-10 28 views
0

我在写一个存储过程,它应该能够接受空值(tmpParameter)以及非空值(smallint)。我将如何组合逻辑,以便它可以在一个select语句中处理它们两个呢?具有NULL和非NULL值的SELECT语句

IF @tmpParameter IS NULL 
SELECT [Key] 
     ,[Parent_Key] 
     ,[Parent_Code] 
     ,[Code] 
     ,[Desc] 
     ,[Point] 
     ,[By] 
     ,[On] 
FROM [db].[stats] t WHERE t.[Parent_Key] IS NULL 
ELSE 
SELECT [Key] 
     ,[Parent_Key] 
     ,[Parent_Code] 
     ,[Code] 
     ,[Desc] 
     ,[Point] 
     ,[By] 
     ,[On] 
FROM [db].[stats] t WHERE t.[Parent_Key]= @tmpParameter 

有没有什么办法可以在一个声明中做到这一点?

+0

能't。[Parent_Key]'永远是否定的吗? – Siyual

+0

@SIYUAL nah,它是一个主键,由sql – Ramie

+0

生成,因为它不会是负数,只需给参数一个默认值-1即可。那么你只需要一个查询,而你的where子句将在哪里t.Parent_Key = @ tmpParameter OR @ tmpParameter = -1 –

回答

3

我喜欢为读者写信。所以我只想说清楚。 (和索引友好。)

SELECT [Key] 
     ,[Parent_Key] 
     ,[Parent_Code] 
     ,[Code] 
     ,[Desc] 
     ,[Point] 
     ,[By] 
     ,[On] 
FROM [db].[stats] t 
WHERE t.[Parent_Key] = @tmpParameter 
OR (t.[Parent_Key] IS NULL AND @tmpParameter IS NULL) 
0

由于t.[Parent_Key]不能为负,则可以使用Coalesce强制Null为-1,并检查在一个声明:

SELECT [Key] 
     ,[Parent_Key] 
     ,[Parent_Code] 
     ,[Code] 
     ,[Desc] 
     ,[Point] 
     ,[By] 
     ,[On] 
FROM [db].[stats] t 
WHERE COALESCE(t.[Parent_Key], -1) = COALESCE(@tmpParameter, -1) 

如果@tmpParameter为空,它会返回任何Parent_Key即空,通过铸造两者为-1。如果它不为空,它将返回任何值为Parent_Key的值。

+0

这个查询是nonSARGable,并且在大型数据集上不能很好地执行。 –

+0

@SeanLange我不确定nonSARGable是什么意思? – Siyual

+0

sargable =“搜索参数”。换句话说,当你将你的列包装在联接或where子句谓词中的函数中时,你的查询将无法使用该列上的任何索引。它会强制扫描而不是查找。 –