Выражение после THEN в синтаксисе «CASE ... WHEN ... THEN» - PullRequest
1 голос
/ 04 апреля 2019

Этот sql работает правильно:

DECLARE @check bit = 1

  SELECT * FROM [TABLE]
  WHERE [STATUS] = 1
  AND [TYPE] =
  CASE WHEN @check = 0 THEN 'typeA'
  ELSE 'typeB'
  END

Но когда я пытаюсь использовать выражение с 'ИЛИ', я получаю ошибку:

DECLARE @check bit = 1

  SELECT * FROM [TABLE]
  WHERE [STATUS] = 1
  AND [TYPE] =
  CASE WHEN @check = 0 THEN 'typeA'
  ELSE ('typeB' OR 'typeC')
  END

Например, я ожидаюиметь:

If(@check = 0) -> ... WHERE [Type] = sth OR sth

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Корпус переключателя не работает таким образом. Предложение ELSE - это то, к чему по умолчанию следует обращаться, если ни один из других фильтров не обеспечивает решение. CASE - это не более чем серия утверждений IF. Итак, вы в основном написали следующее:

if the value of @check is 0 then return 'typeA'
otherwise return ('typeB' OR 'typeC')

Но как SQL может возвращать несколько значений? Скорее всего, вы должны изменить свое утверждение CASE, как показано ниже Вместо проверки @check вы должны проверить элемент, который имеет несколько опций. Приведенный ниже запрос вернет записи, в которых TYPE - это typeA или typeB, если @check = 0.

  DECLARE @check bit = 1

  SELECT * FROM @table
  WHERE [STATUS] = 1
  AND CASE [TYPE] WHEN 'typeA' THEN 0 WHEN 'typeB' THEN 0 WHEN 'typeC' THEN 1 END = 0 AND @check = 0
1 голос
/ 04 апреля 2019

это то, что вы пытаетесь достичь? (расширен для удобства чтения)

SELECT  *
FROM    [TABLE]
WHERE   [STATUS] = 1
        AND 
        (
            (
                @check = 0
                AND [TYPE] = 'typeA'
            )
            OR
            (
                @check = 1
                AND [TYPE] IN ('typeB', 'typeC')
            )
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...