Frage

Was ist der vollständig und korrekte Syntax für den SQL-Case-Ausdruck?

War es hilfreich?

Lösung

Der vollständig Die Syntax hängt von der Datenbank-Engine ab, mit der Sie arbeiten:

Für SQL Server:

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

oder:

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

Ausdrücke usw.:

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

Verknüpfung: CASE (Transact-SQL)

Beachten Sie außerdem, dass die Reihenfolge der WHEN-Anweisungen wichtig ist.Sie können problemlos mehrere WHEN-Klauseln schreiben, die sich überschneiden, und Es wird der erste passende verwendet.

Notiz:Wenn keine ELSE-Klausel angegeben ist und keine passende WHEN-Bedingung gefunden wird, wird der Wert des CASE-Ausdrucks verwendet NULL.

Andere Tipps

Wenn man bedenkt, dass Sie mehrere Produkte getaggt haben, würde ich das sagen voll Die richtige Syntax wäre die im ISO/ANSI SQL-92-Standard:

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

Syntaxregeln

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

Hier sind die CASE Anweisungsbeispiele aus den PostgreSQL-Dokumenten (Postgres folgt hier dem SQL-Standard):

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

oder

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

Offensichtlich ist das zweite Formular übersichtlicher, wenn Sie nur ein Feld anhand einer Liste möglicher Werte überprüfen.Die erste Form erlaubt kompliziertere Ausdrücke.

Sybase hat das gleiche Fallsyntax als SQL Server:

Beschreibung

Unterstützt bedingte SQL-Ausdrücke;kann überall dort verwendet werden, wo ein Wertausdruck verwendet werden kann.

Syntax

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

Syntax für Groß- und Kleinschreibung

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

Parameter

Fall

beginnt mit dem case-Ausdruck.

Wann

steht vor der Suchbedingung oder dem zu vergleichenden Ausdruck.

Suchbedingung

wird verwendet, um Bedingungen für die ausgewählten Ergebnisse festzulegen.Suchbedingungen für case-Ausdrücke ähneln den Suchbedingungen in einer where-Klausel.Suchbedingungen werden im Transact-SQL-Benutzerhandbuch ausführlich beschrieben.

Dann

steht vor dem Ausdruck, der einen Ergebniswert von case angibt.

Ausdruck

ist ein Spaltenname, eine Konstante, eine Funktion, eine Unterabfrage oder eine beliebige Kombination aus Spaltennamen, Konstanten und Funktionen, die durch arithmetische oder bitweise Operatoren verbunden sind.Weitere Informationen zu Ausdrücken finden Sie unter „Ausdrücke“ in.

Beispiel

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

Ich habe die Oracle-Seite für dasselbe ausgegraben und es sieht so aus, als ob es sich um dieselbe Syntax handelt, nur etwas anders beschrieben.

Verknüpfung: Oracle/PLSQL:Falldarstellung

Orakel Syntax aus der 11g-Dokumentation:

CASE { simple_case_expression | searched_case_expression }
     [ else_clause ]
     END

simple_case_expression

expr { WHEN comparison_expr THEN return_expr }...

gesuchter_Fallausdruck

{ WHEN condition THEN return_expr }...

else_clause

ELSE else_expr

Im Fall von Oracle ist Folgendes zu beachten: Wenn no when übereinstimmt und kein else-Teil vorhanden ist, wird eine Ausnahme ausgelöst.

Syntax der Case-Anweisung in SQL SERVER:

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

Und wir können auch Folgendes verwenden:

CASE 
   WHEN column=value1 THEN 1
   WHEN column=value3 THEN 2
   WHEN column=value3 THEN 3
   WHEN column=value1 THEN 4
   ELSE ''
END
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top