Нужна помощь с синтаксисом для теста ISNUMERIC в случае - PullRequest
1 голос
/ 06 июля 2010

Я пытаюсь остановить ввод отрицательных значений для обработки в любом из диапазонов; скорее, если они отрицательные, они должны опуститься до конца 1-го оператора case как «Invalid». Это не работает, так как когда я запускаю тест для ввода (-1000), я получаю строку для <= 50K. Боюсь, что мой синтаксис неправильный, но не уверен, почему. </p>

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

Ответы [ 4 ]

2 голосов
/ 06 июля 2010

ISNUMERIC всегда верно для INT поля, вы можете спокойно выбросить его.

Попробуйте это:

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 голосов
/ 06 июля 2010

Ну не -1000 меньше, чем 50000? Разве вам не нужно, чтобы этот случай был:

Когда @ FN_1ST_UPB_Band между 0 и 49999, тогда '<= 50K' </p>

0 голосов
/ 06 июля 2010

Поскольку они оцениваются по порядку, -1000 составляет <= 50000, поэтому он оценивается как истина и возвращает «<= 50000».Вместо этого вам нужно <code>between 1 and 49999 (не 50000, поскольку у вас было 50000, в двух случаях значение true).

0 голосов
/ 06 июля 2010

в этом случае (без каламбура)

сделайте это

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

, потому что -1000 меньше 50000

...