Использование Microsoft SQL Server

select *,
case table1.indthrud when is null then 'Current' when is not null then 'Historical' end Indicator

    from table1

Когда я пытаюсь выполнить вышеуказанный запрос, он дает следующую ошибку

Неправильный синтаксис рядом с ключевым словом is.

Однако приведенный ниже запрос работает нормально:


    select *,
    case  when  table1.indthru is null then 'Current' when  table1.indthru is not null then 'Historical' end Ind
    from table1

Можете ли вы объяснить, почему аргумент не может быть поставлен перед CASE и должен быть выделен индивидуально?

Заранее спасибо!

0
Syed Ali Ahmed Islam 17 Сен 2021 в 15:25

2 ответа

Лучший ответ

Вы пытаетесь использовать синтаксис простого случая . В стандарте SQL-92 * синтаксис описан следующим образом:

<simple case> ::=
     CASE <case operand>
       <simple when clause>...
       [ <else clause> ]
     END

[...]

<simple when clause> ::= WHEN <when operand> THEN <result>

[...]

<when operand> ::= <value expression>

А <value expression> описывается позже как:

<value expression> ::=
       <numeric value expression>
     | <string value expression>
     | <datetime value expression>
     | <interval value expression>

Так что в основном WHEN IS [NOT] NULL THEN - это синтаксическая ошибка. Следует использовать синтаксис искомого регистра :

CASE
    WHEN expr IS NULL THEN 'current'
    WHEN expr IS NOT NULL THEN 'Historical'
END

Обратите внимание, что WHEN NULL THEN работает с точки зрения синтаксиса, но не дает ожидаемого результата. Этот:

CASE expr WHEN NULL THEN 'x'

Эквивалентен:

CASE WHEN expr = NULL THEN 'x'

И вы не можете сравнивать значения NULL с помощью оператора =.

0
Salman A 17 Сен 2021 в 13:04

Во-первых, ваша ошибка связана с тем, что is not null не является значением. Ваш первый case ищет константу для сравнения. И is not null не является константой.

Во-вторых, когда константа равна null, совпадения по-прежнему нет, поскольку null = null вычисляет значение null, которое в данном контексте считается ложным.

Самое простое выражение того, что вы хотите, будет использовать else:

select t1.*,
       (case when t1.indthru is null then 'Current' else 'Historical' end) as Ind
from table1 t1
1
Gordon Linoff 17 Сен 2021 в 12:27