SQL Server - CASE 中的 CASE 检查 NULL

Posted

技术标签:

【中文标题】SQL Server - CASE 中的 CASE 检查 NULL【英文标题】:SQL Server - CASE within a CASE checking for NULL 【发布时间】:2010-07-02 21:40:27 【问题描述】:

我仍在学习 SQL,所以这似乎是一个非常奇怪的问题,但这是在 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

【问题讨论】:

【参考方案1】:

如果@FN_InputDt 为空,那么@MonthNo 也将为空,因此您可以跳过检查@FN_InputDt 是否为空。

您也可以通过使用@MonthNo 作为索引来选择字符串的一部分来跳过另一种情况:

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

如果@MonthNo 为空,@Result 也将为空。

【讨论】:

-1,见Jeff的评论,有一个库函数可以获取月份名 @Hogan:是的,这个替代方案值得一提,但它并没有给出与问题中的函数完全相同的结果。 很高兴知道,它有何不同?【参考方案2】:

设置@Result = Left(DateName(m,@FN_InputDt) , 3)

这会将月份转换为名称,并且只显示前 3 个字符。

【讨论】:

那不是 DatePart 不是 DateName 吗? @Hogan - DatePart 将返回月份的数值,而不是月份的实际名称。例如,12 而不是 'Dec'。

以上是关于SQL Server - CASE 中的 CASE 检查 NULL的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中的 case 语句中寻找解决方案

where 子句中的 case 语句 - SQL Server

SQL Server:CASE 语句中的 OR 语句

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

我想使用 CASE 语句来更新 sql server 2005 中的一些记录

sql server 2008 r2:当前会计年度 where 子句中的 case 语句