Да, это очень легко сделать с CHOOSE
:
declare @given_number int=5;
SELECT
@given_number AS given_number,
CHOOSE(@given_number
,1
,2
,6
,24
,120
,720
,5040
,40320
,362880
,3628800
,39916800
,479001600
,6227020800
,87178291200
,1307674368000
,20922789888000
,355687428096000
,6402373705728000
,121645100408832000
,2432902008176640000) AS factorial;
Демоверсия DBFiddle
РЕДАКТИРОВАТЬ (забавная часть):
Но примете ли вы вызов Мартина Смита, исключая букву S?
Сегодня я вспоминаю, что CASE/IIF
может быть вложено только 10 раз:)
declare @given_number int=5;
PRINT CONCAT('For ' ,@given_number, ' factorial = ',
IIF(@given_number=1,1
,IIF(@given_number=2,2
,IIF(@given_number=3,6
,IIF(@given_number=4,24
,IIF(@given_number=5,120
,IIF(@given_number=6,720
,IIF(@given_number=7,5040
,IIF(@given_number=8,40320
,IIF(@given_number=9,362880
,IIF(@given_number=10,3628800, -1)))))))))));
DBFiddle Demo2
EDIT2:
Один из способов обойти ограничение IIF
- использовать оригинальный запрос с динамическим SQL + exchange S
с CHAR(83)
:
declare @t NVARCHAR(MAX) = 'declare @given_number int=5;' + CHAR(83) + 'ELECT given_number = @given_number, factorial = CHOO'+ CHAR(83) +'E(@given_number ,1 ,2 ,6 ,24 ,120 ,720 ,5040 ,40320 ,362880 ,3628800 ,39916800 ,479001600 ,6227020800 ,87178291200 ,1307674368000 ,20922789888000 ,355687428096000 ,6402373705728000 ,121645100408832000 ,2432902008176640000);';
EXEC(@t);
DBFiddle Demo3