Оператор выбора SQL может провалиться?

Существует ли способ заставить Оператор выбора в SQL провалиться как оператор выбора в C#? То, что я не хочу делать, является примером ниже, но если это - моя единственная опция, я предполагаю, что пойду с ним.

ПРИМЕР:

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

Править:

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

11
задан Cœur 10 December 2018 в 06:56
поделиться

3 ответа

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

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

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

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

11
ответ дан 3 December 2019 в 07:37
поделиться

Я спрашиваю себе два простых вопроса:

  • Я делаю это, потому что это дьянько умно и / или показывает мои обширные знания о Perl Arcana?

тогда это плохое представление. Но

  • я делаю это, потому что это идиоматическое Perl и преимущества от четких преимуществ Perl?

Тогда это хорошая идея.

Я не вижу безправной причины отклонить, скажем, строку интерполяции только потому, что Java и C не имеют его. Если не является смешным, но я думаю, что начну подпрограмма со случайными

return undef unless <something>;

не так уж и плохо.

-121--3033295-

может альтернативно использовать 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:

Литье @intvar: 550

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

0
ответ дан 3 December 2019 в 07:37
поделиться

Смотрите ORMBattle.NET - он точно не ответит на ваш вопрос (btw, вряд ли это возможно), но есть некоторая информация о качестве поддержки LINQ.

Примечание (или отказ от ответственности): Я являюсь одним из лиц, связанных с созданием ORMBattle.NET, а также одним из авторов DataObjects.Net .

-121--4859739-

Если вы используете Textmate (mac), вы можете установить этот пакет

В основном jslint, который будет проверять синтаксис JS.
И он содержит некоторые другие вкусности, как различные инструменты сжатия

-121--1475580-

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

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

5
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: