我正在编写一个存储过程,它应该能够接受空值(tmpParameter)以及非空值(smallint)。我如何组合逻辑,以便它可以在一个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 :(得分: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)
答案 1 :(得分: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
为null,它将返回任何为空的Parent_Key
,将两者都转换为-1。如果它不为空,它将返回该值的任何Parent_Key
。