Может ли SQL Case Statement провалиться? - PullRequest
10 голосов
/ 22 января 2010

Есть ли способ заставить оператор CASE в SQL проваливаться как оператор case в C #? То, что я не хочу делать, это пример ниже, но если это мой единственный вариант, я думаю, я пойду с этим.

Пример:

@NewValue =
   CASE
      WHEN @MyValue = '1' THEN CAST(@MyValue AS int)
      WHEN @MyValue = '2' THEN CAST(@MyValue AS int)
      ELSE NULL
   END

EDIT:

Я использую SQL Server.

Ответы [ 3 ]

10 голосов
/ 22 января 2010

Чтобы ответить на ваш конкретный вопрос: Нет, не может.

См., Например, документацию MySQL для CASE . Каждый WHEN должен иметь THEN result, и нет никакого способа обойти это. THEN не помечен как необязательный. То же самое относится ко всем другим СУБД, которые я использовал.

Вот еще один пример: Выражение CASE сервера Sql

У вас уже есть хороший альтернативный способ сделать это в виде комментария, поэтому я не буду повторять это здесь.

5 голосов
/ 22 января 2010

Вы также можете сделать это так:

@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') будет иметь больше смысла.

0 голосов
/ 22 января 2010

Может альтернативно использовать T-SQL try-catch. Однако я не уверен, какое негативное влияние это окажет на сервер:

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

Выход: Кастинг @stringVar:

Casting @intVar: 550

Кроме того, я бы создал пользовательские функции для тех операторов try catch, которые принимают varchar inputString и int default_value, которые возвращают целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...