sql - son - instrucciones select
Sintaxis de expresión de caso SQL? (8)
¿Cuál es la sintaxis completa y correcta para la expresión de caso de SQL?
Aquí están los ejemplos de sentencias CASE
de los documentos de PostgreSQL (Postgres sigue el estándar SQL aquí):
SELECT a,
CASE WHEN a=1 THEN ''one''
WHEN a=2 THEN ''two''
ELSE ''other''
END
FROM test;
o
SELECT a,
CASE a WHEN 1 THEN ''one''
WHEN 2 THEN ''two''
ELSE ''other''
END
FROM test;
Obviamente, el segundo formulario es más claro cuando solo está comprobando un campo contra una lista de valores posibles. La primera forma permite expresiones más complicadas.
Desenterré la página de Oracle para el mismo y parece que esta es la misma sintaxis, que acabo de describir ligeramente diferente.
La sintaxis completa depende del motor de base de datos con el que está trabajando:
Para SQL Server:
CASE case-expression
WHEN when-expression-1 THEN value-1
[ WHEN when-expression-n THEN value-n ... ]
[ ELSE else-value ]
END
o:
CASE
WHEN boolean-when-expression-1 THEN value-1
[ WHEN boolean-when-expression-n THEN value-n ... ]
[ ELSE else-value ]
END
expresiones, 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
Enlace: CASE (Transact-SQL)
También tenga en cuenta que el orden de las declaraciones WHEN es importante. Puede escribir fácilmente múltiples cláusulas WHEN que se superponen, y se usa la primera que coincida .
Nota : Si no se especifica ninguna cláusula ELSE, y no se encuentra ninguna condición coincidente WHEN, el valor de la expresión CASE será NULL .
Sintaxis de sentencia de caso en SQL SERVER:
CASE column
WHEN value1 THEN 1
WHEN value3 THEN 2
WHEN value3 THEN 3
WHEN value1 THEN 4
ELSE ''''
END
Y podemos usar también a continuación:
CASE
WHEN column=value1 THEN 1
WHEN column=value3 THEN 2
WHEN column=value3 THEN 3
WHEN column=value1 THEN 4
ELSE ''''
END
Sybase tiene la misma sintaxis de caso que SQL Server:
Descripción
Admite expresiones SQL condicionales; se puede usar en cualquier lugar donde se pueda usar una expresión de valor.
Sintaxis
case
when search_condition then expression
[when search_condition then expression]...
[else expression]
end
Sintaxis de caso y valores
case expression
when expression then expression
[when expression then expression]...
[else expression]
end
Parámetros
caso
comienza la expresión de caso.
cuando
precede la condición de búsqueda o la expresión que se comparará.
search_condition
se usa para establecer condiciones para los resultados que se seleccionan. Las condiciones de búsqueda para expresiones de casos son similares a las condiciones de búsqueda en una cláusula where. Las condiciones de búsqueda se detallan en la Guía del usuario de Transact-SQL.
entonces
precede a la expresión que especifica un valor de resultado de caso.
expresión
es un nombre de columna, una constante, una función, una subconsulta o cualquier combinación de nombres de columna, constantes y funciones conectadas por operadores aritméticos o bit a bit. Para obtener más información sobre expresiones, consulte "Expresiones" en.
Ejemplo
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
Teniendo en cuenta que etiquetó varios productos, diría que la sintaxis correcta completa sería la que se encuentra en el estándar 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>
Reglas de sintaxis
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>.
Un punto a tener en cuenta en el caso de Oracle, si no hay coincidencias y no hay otra parte, se genera una excepción.
Sintaxis de Oracle de la Documentación 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