2010-07-02 70 views
3

我仍然在学习SQL,所以这可能看起来是一个非常奇怪的问题,但这是在CASE中使用CASE来检查NULL的最佳方式吗?SQL Server - CASE中CASE检查NULL

@FN_InputDt datetime) 
RETURNS varchar(3) 
as 
BEGIN 

DECLARE @Result varchar(3), 
     @MonthNo int 

Set @MonthNo = datepart(m,@FN_InputDt) 

Set @Result = 
     CASE WHEN @FN_InputDt IS NOT NULL then 
     CASE @MonthNo 
      WHEN 1 then 'JAN'             
      WHEN 2 then 'FEB' 
      WHEN 3 then 'MAR' 
      WHEN 4 then 'APR' 
      WHEN 5 then 'MAY' 
      WHEN 6 then 'JUN' 
      WHEN 7 then 'JUL'     
      WHEN 8 then 'AUG' 
      WHEN 9 then 'SEP' 
      WHEN 10 then 'OCT' 
      WHEN 11 then 'NOV' 
      WHEN 12 then 'DEC' 
     END 
     END 

     RETURN @Result 
    END 

回答

3

如果@FN_InputDt为null,则@MonthNo也将是无效的,所以你可以直接跳过检查是否@FN_InputDt为null。

您可以只使用@MonthNo作为指标来选择一个字符串的一部分也跳到另一种情况:

set @Result = substring(
    'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC', 
    @MonthNo * 3 - 2, 
    3 
) 

如果@MonthNo为空@Result也将是无效的。

+0

-1,看杰夫的评论,有一个库函数来获取月份名称 – Hogan 2010-07-04 23:44:21

+0

@霍根:是的,这种选择是值得一提的,但它并没有给出与问题中的函数完全相同的结果。 – Guffa 2010-07-05 00:04:45

+0

很高兴知道,它有什么不同? – Hogan 2010-07-09 15:26:06

3

集@Result =左(DATENAME(米,@ FN_InputDt),3)

这一个月转换为名称和仅显示前3个字符。

+0

是不是说DatePart不是DateName? – Hogan 2010-07-04 23:45:03

+0

@Hogan - DatePart将返回月份的数字值,而不是本月的实际名称。例如12而不是'十二月'。 – JeffO 2010-07-06 00:07:52