62 votes

Syntaxe d'instruction de cas SQL?

Quelle est la syntaxe complète et correcte pour l'instruction SQL Case?

81voto

Lasse V. Karlsen Points 148037

La complète de la syntaxe dépend du moteur de base de données vous travaillez:

Pour SQL Server:

  CASE case-expression
      WHEN when-expression-1 THEN value-1
    [ WHEN when-expression-n THEN value-n ... ]
[ ELSE else-value ]
  END

ou:

  CASE
      WHEN boolean-when-expression-1 THEN value-1
    [ WHEN boolean-when-expression-n THEN value-n ... ]
[ ELSE else-value ]
  END

les expressions, etc:

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

Lien: CAS (Transact-SQL)

Notez également que la commande de la LORS de déclarations est important. Vous pouvez facilement écrire plusieurs clauses when qui se chevauchent, et le premier correspondant est utilisé.

Remarque: Si aucune clause ELSE est spécifié, et aucune correspondance, LORSQUE la condition est trouvée, la valeur de l'expression case sera NULL.

21voto

onedaywhen Points 24594

Considérant que vous avez balisé plusieurs produits, je dirais que la syntaxe correcte complète serait celle qui figure 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>.
 

19voto

Neall Points 12075

Voici les exemples d'instructions CASE des docs PostgreSQL (Postgres respecte la norme 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;
 

De toute évidence, le second formulaire est plus propre lorsque vous ne faites que cocher un champ par rapport à une liste de valeurs possibles. La première forme permet des expressions plus compliquées.

9voto

Eric Johnson Points 5217

Sybase a le même cas de syntaxe SQL Server:

Description

Prend en charge conditionnelle des expressions SQL; peut être utilisé partout où une expression de valeur peut être utilisé.

La syntaxe

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

Les cas et les valeurs de la syntaxe

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

Paramètres

cas

commence le cas de l'expression.

lorsque

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

search_condition

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

alors

précède l'expression qui indique une valeur de résultat de l'affaire.

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 reliées par calcul ou d'opérateurs au niveau du bit. Pour plus d'informations sur les expressions, voir la section "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

4voto

Lasse V. Karlsen Points 148037

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: Instruction de cas

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X