Что такое полный и правильный синтаксис для оператора SQL Case?
Синтаксис синтаксиса SQL?
Ответ 1
Синтаксис полный зависит от механизма работы с базой данных, с которым вы работаете:
Для SQL Server:
CASE case-expression
    WHEN when-expression-1 THEN value-1
  [ WHEN when-expression-n THEN value-n ... ]
  [ ELSE else-value ]
END
или
CASE
    WHEN boolean-when-expression-1 THEN value-1
  [ WHEN boolean-when-expression-n THEN value-n ... ]
  [ ELSE else-value ]
END
и т.д.:
case-expression    - something that produces a value
when-expression-x  - something that is compared against the case-expression
value-1            - the result of the CASE statement if:
                         the when-expression == case-expression
                      OR the boolean-when-expression == TRUE
boolean-when-exp.. - something that produces a TRUE/FALSE answer
Ссылка: CASE (Transact-SQL)
Также обратите внимание, что порядок инструкций WHEN важен. Вы можете легко написать несколько предложений WHEN, которые перекрываются, и используется первый, который соответствует.
Примечание. Если не указано условие ELSE и не найдено подходящего WHEN-условия, значение выражения CASE будет NULL.
Ответ 2
Учитывая, что вы отметили несколько продуктов, я бы сказал, что полный правильный синтаксис будет соответствовать стандарту ISO/ANSI SQL-92:
<case expression> ::=
       <case abbreviation>
     | <case specification>
<case abbreviation> ::=
       NULLIF <left paren> <value expression> <comma>
              <value expression> <right paren>
     | COALESCE <left paren> <value expression>
                { <comma> <value expression> }... <right paren>
<case specification> ::=
       <simple case>
     | <searched case>
<simple case> ::=
     CASE <case operand>
          <simple when clause>...
        [ <else clause> ]
     END
<searched case> ::=
     CASE
       <searched when clause>...
     [ <else clause> ]
     END
<simple when clause> ::= WHEN <when operand> THEN <result>
<searched when clause> ::= WHEN <search condition> THEN <result>
<else clause> ::= ELSE <result>
<case operand> ::= <value expression>
<when operand> ::= <value expression>
<result> ::= <result expression> | NULL
<result expression> ::= <value expression>
Правила синтаксиса
1) NULLIF (V1, V2) is equivalent to the following <case specification>:
     CASE WHEN V1=V2 THEN NULL ELSE V1 END
2) COALESCE (V1, V2) is equivalent to the following <case specification>:
     CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
3) COALESCE (V1, V2, . . . ,n ), for n >= 3, is equivalent to the
   following <case specification>:
     CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, . . . ,n )
     END
4) If a <case specification> specifies a <simple case>, then let CO
   be the <case operand>:
   a) The data type of each <when operand> WO shall be comparable
      with the data type of the <case operand>.
   b) The <case specification> is equivalent to a <searched case>
      in which each <searched when clause> specifies a <search
      condition> of the form "CO=WO".
5) At least one <result> in a <case specification> shall specify a
   <result expression>.
6) If an <else clause> is not specified, then ELSE NULL is im-
   plicit.
7) The data type of a <case specification> is determined by ap-
   plying Subclause 9.3, "Set operation result data types", to the
   data types of all <result expression>s in the <case specifica-
   tion>.
Access Rules
   None.
General Rules
1) Case:
   a) If a <result> specifies NULL, then its value is the null
      value.
   b) If a <result> specifies a <value expression>, then its value
      is the value of that <value expression>.
2) Case:
   a) If the <search condition> of some <searched when clause> in
      a <case specification> is true, then the value of the <case
      specification> is the value of the <result> of the first
      (leftmost) <searched when clause> whose <search condition> is
      true, cast as the data type of the <case specification>.
   b) If no <search condition> in a <case specification> is true,
      then the value of the <case expression> is the value of the
      <result> of the explicit or implicit <else clause>, cast as
      the data type of the <case specification>.
Ответ 3
Вот примеры CASE из документов PostgreSQL (Postgres следует за стандартом SQL здесь):
SELECT a,
   CASE WHEN a=1 THEN 'one'
        WHEN a=2 THEN 'two'
        ELSE 'other'
   END
FROM test;
или
SELECT a,
   CASE a WHEN 1 THEN 'one'
          WHEN 2 THEN 'two'
          ELSE 'other'
   END
FROM test;
Очевидно, что вторая форма чиста, когда вы просто проверяете одно поле на список возможных значений. Первая форма позволяет более сложные выражения.
Ответ 4
Sybase имеет тот же синтаксис case как SQL Server:
Описание
Поддерживает условные выражения SQL; может использоваться везде, где может использоваться выражение значения.
Синтаксис
case 
     when search_condition then expression 
    [when search_condition then expression]...
    [else expression]
end
Синтаксис событий и значений
case expression
     when expression then expression 
    [when expression then expression]...
    [else expression]
end
Параметры
случай
начинается выражение case.
когда
предшествует условию поиска или сравниваемому выражению.
search_condition
используется для задания условий для выбранных результатов. Условия поиска для выражений case аналогичны условиям поиска в предложении where. Условия поиска подробно описаны в руководстве пользователя Transact-SQL.
затем
предшествует выражению, которое указывает значение результата case.
Выражение
- это имя столбца, константа, функция, подзапрос или любая комбинация имен столбцов, констант и функций, связанных арифметическими или побитовыми операторами. Дополнительные сведения об выражениях см. В разделе "Выражения".
Пример
select disaster, 
       case
            when disaster = "earthquake" 
                then "stand in doorway"
            when disaster = "nuclear apocalypse" 
                then "hide in basement"
            when monster = "zombie apocalypse" 
                then "hide with Chuck Norris"
            else
                then "ask mom"
       end 
  from endoftheworld
Ответ 5
Я выкопал страницу Oracle для того же самого, и похоже, что это один и тот же синтаксис, просто немного отличающийся.
Ссылка: Oracle/PLSQL: Case Statement
Ответ 6
Oracle синтаксис из документации 11g:
CASE { simple_case_expression | searched_case_expression }
     [ else_clause ]
     END
<я > simple_case_expression
expr { WHEN comparison_expr THEN return_expr }...
<я > searched_case_expression
{ WHEN condition THEN return_expr }...
<я > else_clause
ELSE else_expr
Ответ 7
Одно замечание в случае Oracle, если нет, когда совпадение и нет другой части, возникает исключение.
Ответ 8
Case statement syntax in SQL SERVER.
CASE column
WHEN value1 THEN 1
WHEN value3 THEN 2
WHEN value3 THEN 3
WHEN value1 THEN 4
ELSE ''
END
And we can use like below also:
CASE 
WHEN column=value1 THEN 1
WHEN column=value3 THEN 2
WHEN column=value3 THEN 3
WHEN column=value1 THEN 4
ELSE ''
END
