Не является нулевым аргументом в СЛУЧАЕ ошибки

#sql #sql-server

Вопрос:

Использование 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
 

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

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

Ответ №1:

Во-первых, ваша ошибка заключается в том, что 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. Большое вам спасибо за это, Гордон! Так что, если я правильно понял, для использования » Случая (аргумента)» «Тогда утверждение» КОГДА » будет искать константу для сравнения. И если нам нужно использовать экземпляры, в которых значение равно null / не равно null, мы должны включать столбец отдельно в каждое предложение WHEN ?

2. @SyedAliAhmedIslam . . . Да, я думаю, вы понимаете, как это работает.

Ответ №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'
 

и результат сравнения нулевых значений с помощью = оператора неизвестен.

Комментарии:

1. Большое тебе спасибо, Салман!