recursive - with sql exemple




SQL Syntaxe d'expression de cas? (6)

Quelle est la syntaxe complète et correcte de l'expression SQL Case?


Considérant que vous avez étiqueté plusieurs produits, je dirais que la syntaxe correcte complète serait celle trouvée dans la norme 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>

Règles de syntaxe

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>.

J'ai déterré la page Oracle pour la même chose et il semble que ce soit la même syntaxe, juste décrite légèrement différente.

Lien: Oracle / PLSQL: Déclaration de cas


Sybase a la même syntaxe de cas que SQL Server:

La description

Prend en charge les expressions SQL conditionnelles; peut être utilisé partout où une expression de valeur peut être utilisée.

Syntaxe

case 
     when search_condition then expression 
    [when search_condition then expression]...
    [else expression]
end

Case et syntaxe des valeurs

case expression
     when expression then expression 
    [when expression then expression]...
    [else expression]
end

Paramètres

Cas

commence l'expression du cas.

quand

précède la condition de recherche ou l'expression à comparer.

search_condition

est utilisé pour définir les conditions pour les résultats sélectionnés. Les conditions de recherche pour les expressions de cas sont similaires aux conditions de recherche dans une clause where. Les conditions de recherche sont détaillées dans le Guide de l'utilisateur de Transact-SQL.

puis

précède l'expression qui spécifie une valeur de résultat de case.

expression

est un nom de colonne, une constante, une fonction, une sous-requête ou toute combinaison de noms de colonnes, de constantes et de fonctions connectées par des opérateurs arithmétiques ou bit à bit. Pour plus d'informations sur les expressions, voir "Expressions" dans.

Exemple

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

Syntaxe de l'instruction de cas dans SQL SERVER:

CASE column
   WHEN value1 THEN 1
   WHEN value3 THEN 2
   WHEN value3 THEN 3
   WHEN value1 THEN 4
   ELSE ''
END

Et nous pouvons utiliser comme ci-dessous aussi:

CASE 
   WHEN column=value1 THEN 1
   WHEN column=value3 THEN 2
   WHEN column=value3 THEN 3
   WHEN column=value1 THEN 4
   ELSE ''
END

Voici les exemples d'instructions CASE des documents PostgreSQL (Postgres suit le standard SQL ici):

SELECT a,
   CASE WHEN a=1 THEN 'one'
        WHEN a=2 THEN 'two'
        ELSE 'other'
   END
FROM test;

ou

SELECT a,
   CASE a WHEN 1 THEN 'one'
          WHEN 2 THEN 'two'
          ELSE 'other'
   END
FROM test;

Évidemment, la deuxième forme est plus propre lorsque vous vérifiez simplement un champ par rapport à une liste de valeurs possibles. La première forme permet des expressions plus compliquées.


Syntaxe Oracle de la documentation 11g :

CASE { simple_case_expression | searched_case_expression }
     [ else_clause ]
     END

simple_case_expression

expr { WHEN comparison_expr THEN return_expr }...

search_case_expression

{ WHEN condition THEN return_expr }...

else_clause

ELSE else_expr




case