Может ли 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, который возвращает целое число.