Syntaxe des expressions de cas SQL ?
-
08-06-2019 - |
Question
Quel est le complet et la syntaxe correcte pour l'expression SQL Case ?
La solution
Le complet la syntaxe dépend du moteur de base de données avec lequel 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
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 l'ordre des instructions WHEN est important.Vous pouvez facilement écrire plusieurs clauses WHEN qui se chevauchent, et le premier qui correspond est utilisé.
Note:Si aucune clause ELSE n'est spécifiée et qu'aucune condition WHEN correspondante n'est trouvée, la valeur de l'expression CASE sera NUL.
Autres conseils
Étant donné que vous avez tagué plusieurs produits, je dirais que complet la syntaxe correcte 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>.
Voici les CASE
exemples d'instructions tirés de la documentation PostgreSQL (Postgres suit ici le standard SQL) :
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, le deuxième formulaire est plus propre lorsque vous comparez simplement un champ à une liste de valeurs possibles.La première forme permet des expressions plus compliquées.
Sybase a le même syntaxe de cas en tant que serveur SQL :
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
Syntaxe des cas et des valeurs
case expression
when expression then expression
[when expression then expression]...
[else expression]
end
Paramètres
cas
commence l’expression de cas.
quand
précède la condition de recherche ou l’expression à comparer.
condition_de recherche
est utilisé pour définir les conditions pour les résultats sélectionnés.Les conditions de recherche des expressions case sont similaires aux conditions de recherche dans une clause Where.Les conditions de recherche sont détaillées dans le Guide de l'utilisateur Transact-SQL.
alors
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és par des opérateurs arithmétiques ou au niveau du 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
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éremment.
Oracle syntaxe de la documentation 11g:
CASE { simple_case_expression | searched_case_expression }
[ else_clause ]
END
expression_cas_simple
expr { WHEN comparison_expr THEN return_expr }...
expression_cas_recherchée
{ WHEN condition THEN return_expr }...
clause_autre
ELSE else_expr
Un point à noter dans le cas d'Oracle, si non lorsque correspond et qu'il n'y a pas d'autre partie, une exception est levée.
Syntaxe de l'instruction Case 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 également utiliser comme ci-dessous :
CASE
WHEN column=value1 THEN 1
WHEN column=value3 THEN 2
WHEN column=value3 THEN 3
WHEN column=value1 THEN 4
ELSE ''
END