#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. Большое тебе спасибо, Салман!