2010-07-06 10 views
1

Je suis en train d'arrêter l'entrée des valeurs négatives pour traiter dans l'une des gammes plutôt si elles sont négatives ils devraient descendre à la fin de la déclaration du 1er cas comme « invalide » . Cela ne fonctionne pas comme quand je lance un test contre l'entrée de (-1000) je reçois une ligne pour < = 50K. J'ai peur que ma syntaxe soit fausse, mais je ne sais pas pourquoi.Besoin d'aide avec la syntaxe pour ISNUMERIC test en cas

ALTER FUNCTION [dbo].[FN_1ST_UPB_Bands] 
(
    @FN_1ST_UPB_Band   int 
    ) 

RETURNS varchar(16) 
AS 
BEGIN 

declare @Return varchar (16) 

select @Return = 

     Case 
      When ISNUMERIC(@FN_1ST_UPB_Band)= 1 then 

     case 
      When @FN_1ST_UPB_Band is NULL then ' Missing' 
      When @FN_1ST_UPB_Band = 0 then ' 0' 
      When @FN_1ST_UPB_Band < = 50000 then ' <=50K' 
      When @FN_1ST_UPB_Band between 50000 and 100000 then ' 50-100' 
      When @FN_1ST_UPB_Band between 100000 and 150000 then '100-150' 
      When @FN_1ST_UPB_Band between 150000 and 200000 then '150-200' 
      When @FN_1ST_UPB_Band between 200000 and 250000 then '200-250' 
      When @FN_1ST_UPB_Band between 250000 and 300000 then '250-300' 
      When @FN_1ST_UPB_Band between 300000 and 350000 then '300-350' 
      When @FN_1ST_UPB_Band between 350000 and 400000 then '350-400' 
      When @FN_1ST_UPB_Band between 400000 and 450000 then '400-450' 
      When @FN_1ST_UPB_Band between 450000 and 500000 then '450-500' 
      When @FN_1ST_UPB_Band > 500000 then '500K+' 
      else null End 
     else 'Invalid' End 

    RETURN @return 
End 

Répondre

2

ISNUMERIC est toujours vrai sur un champ INT, vous pouvez jeter en toute sécurité.

Essayez ceci:

declare @FN_1ST_UPB_Band INT 
SET @FN_1ST_UPB_Band = -1000 

select case 
      When @FN_1ST_UPB_Band is NULL then ' Missing' 
      When @FN_1ST_UPB_Band < 0 Then 'Invalid' 
      When @FN_1ST_UPB_Band = 0 then ' 0' 
      When @FN_1ST_UPB_Band < = 50000 then ' <=50K' 
      When @FN_1ST_UPB_Band between 50000 and 100000 then ' 50-100' 
      When @FN_1ST_UPB_Band between 100000 and 150000 then '100-150' 
      When @FN_1ST_UPB_Band between 150000 and 200000 then '150-200' 
      When @FN_1ST_UPB_Band between 200000 and 250000 then '200-250' 
      When @FN_1ST_UPB_Band between 250000 and 300000 then '250-300' 
      When @FN_1ST_UPB_Band between 300000 and 350000 then '300-350' 
      When @FN_1ST_UPB_Band between 350000 and 400000 then '350-400' 
      When @FN_1ST_UPB_Band between 400000 and 450000 then '400-450' 
      When @FN_1ST_UPB_Band between 450000 and 500000 then '450-500' 
      When @FN_1ST_UPB_Band > 500000 then '500K+' 
      else null 
     End 
+0

Salut Leslie, pas qu'il a à la sortie comme « <= 0 » par le demandeur, a obtenu à travailler en changeant la bande de Lorsque @ FN_1ST_UPB_Band = 0, '0' à Lorsque @ FN_1ST_UPB_Band = 0, '0' Lorsque @ FN_1st_UPB_BAND <= 0 puis '<= 0' – JMS49

+0

@ JMS49: Mon nom est Alex. – Quassnoi

+0

Quassnoi, je suis désolé il y avait un commentaire de Leslie initialement avec une réponse similaire. C'est ce à quoi je répondais à l'origine. S'il te plait accepte mes excuses. Le patron veut que les nombres négatifs dans le même seau que des zéros, donc je la déclaration Lorsque @ FN_1st_UPB_BAND <= 0 puis « <= 0 ». J'étais sur le point de penser la première fois. – JMS49

0

dans ce cas (sans jeu de mots)

faire ce

When @FN_1ST_UPB_Band < 0 Then 'Invalid' 
When @FN_1ST_UPB_Band >= 0 and @FN_1ST_UPB_Band < = 50000 then ' <=50K' 

parce -1000 est inférieur à 50000

0

Parce qu'ils sont évalués dans l'ordre, -1000 est < = 50000, donc il évalue comme vrai et renvoie le " < = 50000 ". Vous avez besoin de between 1 and 49999 à la place (pas 50000 car vous aviez 50000 évaluées vrai dans 2 cas).

0

bien n'est pas -1000 moins de 50 000? Ne pas vous avez besoin ce cas être:

Lorsque @ FN_1ST_UPB_Band entre 0 et 49999 puis « < = 50K »