2010-07-02 4 views
3

Je continue d'apprendre le SQL, cela peut sembler une question très étrange, mais est-ce la meilleure façon d'utiliser CASE dans un CAS pour vérifier la valeur NULL?SQL Server - CASE dans une recherche CASE pour 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 

Répondre

3

Si @FN_InputDt est nul alors @MonthNo aussi sera nulle, de sorte que vous pouvez simplement sauter vérifier si @FN_InputDt est nul.

Vous pouvez sauter l'autre cas aussi en utilisant simplement @MonthNo comme index pour prendre partie d'une chaîne:

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

Si @MonthNo est @Result null sera également nulle.

+0

-1, Voir le commentaire de Jeff, il ya une fonction de bibliothèque pour obtenir le nom du mois – Hogan

+0

@Hogan: Oui, cette alternative vaut la peine d'être mentionnée, mais elle ne donne pas exactement le même résultat que la fonction dans la question. – Guffa

+0

Bon à savoir, en quoi est-ce différent? – Hogan

3

Set @Result = Gauche (datename (m, @ FN_InputDt), 3)

Il convertit le mois au nom et affiche uniquement les 3 premiers caractères.

+0

n'est-ce pas DatePart pas DateName? – Hogan

+0

@Hogan - DatePart renvoie la valeur numérique du mois et non le nom réel du mois. 12 au lieu de 'Dec' par exemple. – JeffO