SQL Server tiene la capacidad única de permitirle ejecutar lógica programática en tiempo real sobre los valores dentro de su consulta. Basándose en esas evaluaciones lógicas, puede generar varios valores como parte del conjunto de datos devueltos.
Utilizando la sentencia CASE
Esto se consigue más fácilmente en todas las versiones de SQL Server utilizando la sentencia CASE
, que actúa como una expresión lógica IF...THEN...ELSE
y devuelve varios valores dependiendo del resultado.
En este ejemplo de abajo, queremos devolver una columna adicional locale
que especifica si nuestro libro tiene lugar en la Tierra Media o en la vieja Tierra normal.
SELECT CASE WHEN books.title = 'The Hobbit' THEN 'Middle-earth' WHEN books.primary_author = 'Tolkien' THEN 'Middle-earth' ELSE 'Earth' END AS locale, books.*FROM books
Antes de examinar el aspecto especial CASE
de esta declaración, vamos a eliminar temporalmente el CASE
para notar que se trata de una declaración SELECT
extremadamente simple en la superficie:
SELECT books.*FROM books
Por lo tanto, vamos a examinar cómo está estructurada la sección CASE
y qué comportamiento lógico estamos realizando.
CASE WHEN books.title = 'The Hobbit' THEN 'Middle-earth' WHEN books.primary_author = 'Tolkien' THEN 'Middle-earth' ELSE 'Earth'END AS locale
Para empezar, inicializamos la sentencia CASE
y luego especificamos bajo qué condiciones (WHEN
) nuestra sentencia CASE
debe evaluar un resultado. En este ejemplo, estamos examinando los campos books.title
y books.primary_author
; si alguno de ellos se ajusta a nuestro tema tolkieniano, THEN
devolvemos el valor ‘Tierra Media’. Si ninguno de los dos campos coincide con nuestra búsqueda, en su lugar devolvemos el valor de ‘Tierra.’
Para reorganizar la lógica como una declaración psuedo-código IF...THEN...ELSE
, simplemente estamos pidiendo a SQL que evalúe:
IF title == 'The Hobbit' OR primary_author == 'Tolkien'THEN RETURN 'Middle-earth'ELSE RETURN 'Earth'END
Por último, es fundamental recordar que una sentencia CASE
siempre debe ser anexada al final con una sentencia END
que coincida. En el ejemplo anterior, también estamos cambiando el nombre del valor resultante que se devuelve a locale
, aunque eso es ciertamente opcional.
Usando la función IIF
Si estás usando una versión más moderna de SQL, es útil saber que SQL Server 2012 introdujo la muy útil función IIF
IIF
es un método abreviado para realizar una sentencia IF...ELSE
CASE
y devolver uno de los dos valores, dependiendo de la evaluación del resultado.
Reestructurar nuestro ejemplo anterior para utilizar IIF
es bastante sencillo.
SELECT IIF( books.title = 'The Hobbit' OR books.primary_author = 'Tolkien', 'Middle-earth', 'Earth') AS locale, books.*FROM books
Con una función IIF
, sustituimos en gran parte el azúcar sintáctico de la sentencia CASE
por unos simples separadores de comas para diferenciar nuestros argumentos.
En general, tanto CASE
como IIF
hacen el mismo trabajo, pero si se puede elegir, IIF
será mucho más sencillo de usar.