Обратное логическое значение на основе SQL CASE WHEN или IIF - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь сторнировать логический столбец на основе заданного условия в MSSQL (MSSQL Server 2017)

Я пытался использовать IIF и CASE WHEN, но у меня возникли некоторые синтаксические ошибки.

Метод 1: IIF

SELECT
    IIF(Completed_Date > @EndDate AND Completed = 'True', --Conditions
    Completed = 'False', Completed) 
AS 
    Completed_Filter

Метод 2: Случай, когда

CASE WHEN 
    Completed_Date > @EndDate AND Completed = 'True'
THEN 
    Completed = 'False'
ELSE 
    Completed END
AS 
    Completed_Filter

Тип данных поля столбца: [ЗАВЕРШЕНО] [бит] NULL.

Выполнение простого фильтра запроса SELECT * FROM TABLE WHERE Completed != 'False' не выдает ошибок, т. Е. Логический столбец работает должным образом.

Однако меня смущает, почему приведенные выше 2 фрагмента кода приводят к синтаксическим ошибкам, которые возникают при знаке равенства в Completed = 'False'.

Я ожидаю обратить логическое значение с 'True' на 'False' в случае, если Completed_Date > @EndDate, если нет, просто оставьте завершенное логическое значение таким, как есть.

Буду признателен за любую помощь, спасибо

Ответы [ 4 ]

1 голос
/ 06 мая 2019

Это началось как комментарий, но вскоре стало большим, так что ...

Чтобы расширить ответы scaisEdge и Сами:

IIF является синтаксическимсахар для простых case выражений, только с одной then и else частью.Раздел примечаний документации начинается с этого:

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

Выражение case возвращает единственное скалярное значение, основанное на том, какое условие выполнено.
В документации четко указано (опять же, в разделе замечаний), что ононельзя использовать для управления потоком сценария T-SQL:

Выражение CASE нельзя использовать для управления потоком выполнения операторов Transact-SQL, блоков операторов, пользовательскихопределенные функции и хранимые процедуры.

Поэтому проблема в вашем коде заключается в этой части Completed = 'False', внутри оператора case вы можете написать только код, который будет возвращать одно скалярное значение, но этот код этого не делает.

1 голос
/ 05 мая 2019

Вы не можете использовать присваиватель THEN complete = 'FALSE', но просто выберите нужное значение

CASE 
  WHEN Completed_Date > @EndDate AND Completed = 'True'
   THEN 'False'
   ELSE Completed 
END  AS  Completed_Filter
1 голос
/ 05 мая 2019

Вы делаете это неправильно

SELECT
    IIF(Completed_Date > @EndDate AND Completed = 'True', --Conditions
        'False', 
        Completed
        ) 
AS 
    Completed_Filter

То же, что и

SELECT CASE WHEN Completed_Date > @EndDate AND Completed = 'True'
            THEN 'False'
            ELSE Completed
       END Completed_Filter

Из документов IIF()

Возвращает одно из двух значений в зависимости от того, имеет ли логическое выражение значение true или false в SQL Server.

Ваше логическое выражение здесь равно Completed_Date > @EndDate AND Completed = 'True', если это условиевстретил, он возвращает первое значение и, если нет, он возвращает второе.

Нет проблем, когда вы проверяете с 'True'/'False' против BIT, потому что это действительно, строказначения True и False могут быть преобразованы в битовые значения, 1 равно 'True' и 0 равно 'False'.

Проблема заключается в Completed = 'False' причина IIF(), и CASE должно вернутьзначение, а не логическое выражение.

См. CASE выражение и IIF() функция, где выМожно даже найти некоторые примеры.

0 голосов
/ 05 мая 2019

Ваш оператор CASE должен возвращать строку в каждой ветви:

CASE 
  WHEN Completed_Date > @EndDate AND Completed = 'True' THEN 'False'
  ELSE Completed 
END AS Completed_Filter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...