具有NULL和非空值的SELECT语句

时间:2014-07-10 15:31:49

标签: sql sql-server-2008 stored-procedures

我正在编写一个存储过程,它应该能够接受空值(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

我有什么方法可以在一个声明中做到这一点吗?

2 个答案:

答案 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