Вы используете select (exam1), в то время как он должен быть выбран (exam_1). Вы можете использовать select для этой цели, но я думаю, что простое условие может решить эту проблему намного проще:
data test;
length source $32;
do source='99', '34.5', '105', 'ND';
output;
end;
run;
data result(drop = convertedValue);
set test;
if (source eq 'ND') then do;
result = 0;
end;
else do;
convertedValue = input(source,??best.);
if not missing(convertedValue) then do;
if (0 <= round(convertedValue, 1E-12) <= 100) then do;
result = convertedValue;
end;
end;
end;
run;
input (source, ?? best.) пытается преобразовать source в число, и в случае сбоя (например, значения содержат какое-то слово), он не выводит ошибку и просто продолжает исполнение.
round (convertValue, 1E-12) используется, чтобы избежать погрешности точности при сравнении. Если вы хотите сделать это абсолютно безопасно, вы должны использовать что-то вроде
if (0 < round(convertedValue,1E-12) < 100
or abs(round(convertedValue,1E-12)) < 1E-10
or abs(round(convertedValue-100,1E-12)) < 1E-10
)