Синтаксис выражения случая SQL?
Что такое complete и правильный синтаксис для выражения случая SQL?
8 ответов:
The полное синтаксис зависит от компонента database engine, с которым вы работаете:
для 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, которые перекрываются, и первый, который соответствует используется.
Примечание: если никакое другое предложение не указано, и нет соответствия, когда-условие найдено, значение выражения CASE будет NULL.
учитывая, что вы отметили несколько продуктов, я бы сказал полное правильный синтаксис будет найден в стандарте 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>.
здесь
CASE
примеры операторов из PostgreSQL docs (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;
очевидно, что вторая форма чище, когда вы просто проверяете одно поле против списка возможных значений. Первая форма допускает более сложные выражения.
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
я откопал страницу Oracle для того же самого, и похоже, что это тот же синтаксис, только описанный немного по-другому.
ссылки: Oracle / PLSQL: Case Statement
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