Может ли SQL Case Statement провалиться?
Есть ли способ сделать оператор CASE в SQL провальным, как оператор case в С#? То, что я не хочу делать, - это пример ниже, но если это единственный вариант, я думаю, я поеду с ним.
Пример:
@NewValue =
CASE
WHEN @MyValue = '1' THEN CAST(@MyValue AS int)
WHEN @MyValue = '2' THEN CAST(@MyValue AS int)
ELSE NULL
END
EDIT:
Я использую SQL Server.
Ответы
Ответ 1
Чтобы ответить на ваш конкретный вопрос: Нет, он не может.
См., например, документация MySQL для CASE. Каждый WHEN
должен иметь THEN result
, и нет никакого способа обойти это. THEN
не помечен как необязательный. То же самое относится ко всем другим СУБД, которые я использовал.
Вот еще один пример: Sql Server CASE выражение
У вас уже есть хороший альтернативный способ сделать это в виде комментария, поэтому я не буду повторять его здесь.
Ответ 2
Вы также можете сделать это следующим образом:
@NewValue =
CASE
WHEN @MyValue in ( '1', '2' ) THEN CAST(@MyValue AS int)
ELSE NULL
END
или вот так:
CASE @MyValue
WHEN '1' THEN CAST(@MyValue AS int)
WHEN '2' THEN CAST(@MyValue AS int)
ELSE null
END
хотя в этом случае @MyValue in ('1','2')
будет иметь больше смысла.
Ответ 3
В качестве альтернативы можно использовать try-catch T-SQL. Однако я не уверен, какое негативное влияние это имело бы на сервере:
SQL:
DECLARE @intVar VARCHAR(MAX), @stringVar VARCHAR(MAX), @default_value INT, @tempVar INT
SET @default_value = NULL
SET @stringVar = 'Hello World!!'
SET @intVar = '550'
PRINT 'Casting @stringVar: '
BEGIN TRY
SET @tempVar = CAST(@stringVar AS INT)
END TRY
BEGIN CATCH
SET @tempVar = @default_value
END CATCH
PRINT @tempVar + 20
PRINT ''
PRINT 'Casting @intVar: '
BEGIN TRY
SET @tempVar = CAST(@intVar AS INT)
END TRY
BEGIN CATCH
SET @tempVar = @default_value
END CATCH
PRINT @tempVar
Выход:
Casting @stringVar:
Литье @intVar:
550
Кроме того, я бы создал пользовательские функции для этих операторов try catch, которые принимают varchar inputString и int default_value, который возвращает целое число.