9.17.1. CASE
La expresión CASE de SQL es una expresión condicional genérica, similar a las sentencias if/else de otros lenguajes de programación:
CASE WHEN condition THEN result END
Las cláusulas CASE pueden utilizarse siempre que una expresión sea válida. Cada condición es una expresión que devuelve un resultado booleano. Si el resultado de la condición es verdadero, el valor de la expresión CASE es el resultado que sigue a la condición, y el resto de la expresión CASE no se procesa. Si el resultado de la condición no es verdadero, cualquier cláusula WHEN posterior se examina de la misma manera. Si ninguna condición WHEN es verdadera, el valor de la expresión CASE es el resultado de la cláusula ELSE. Si se omite la cláusula ELSE y ninguna condición es verdadera, el resultado es nulo.
Un ejemplo:
SELECT * FROM test; a--- 1 2 3SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other
Los tipos de datos de todas las expresiones de resultado deben ser convertibles a un único tipo de salida. Véase la Sección 10.5 para más detalles.
Hay una forma «simple» de expresión CASE que es una variante de la forma general anterior:
CASE expression WHEN value THEN result END
Se calcula la primera expresión y luego se compara con cada una de las expresiones de valor en las cláusulas WHEN hasta que se encuentre una que sea igual a ella. Si no se encuentra ninguna coincidencia, se devuelve el resultado de la cláusula ELSE (o un valor nulo). Esto es similar a la sentencia switch
en C.
El ejemplo anterior puede escribirse utilizando la sintaxis CASE simple:
SELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other
Una expresión CASE no evalúa ninguna subexpresión que no sea necesaria para determinar el resultado. Por ejemplo, ésta es una forma posible de evitar un fallo de división por cero:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Nota: Como se describe en la sección 4.2.14, hay varias situaciones en las que las subexpresiones de una expresión se evalúan en diferentes momentos, por lo que el principio de que «CASE evalúa sólo las subexpresiones necesarias» no es férreo. Por ejemplo, una subexpresión constante 1/0 suele dar lugar a un fallo de división por cero en tiempo de planificación, aunque esté dentro de un brazo de CASE que nunca se introduciría en tiempo de ejecución.