2016/07/21

IIF, CHOOSE: FUNCIONES NUEVAS POSIBLEMENTE DESCONOCIDAS

PROBLEMA: Desde la versión 2012 tenemos nuevas funciones en muchos aspectos del motor de BD que nos ayudan a mejorar el rendimiento de nuestras o a optimizar las mismas, sabías sobre la inclusión de las funciones IIF y CHOOSE? Sabes para que sirven?

SOLUCION: Les explicaré de manera general el funcionamiento y algunos ejemplos de los mismos.

IIF
Muchas personas que hemos venido trabajando versiones anteriores a SQL SERVER 2012 hemos estado pidiendo a gritos una función similar; devuelve VERDADERO o FALSO para expresión de tipo booleana analizada dentro de la sintaxis.

En anteriores versiones usábamos la sintaxis CASE WHEN para tener un resultado similar a la función IIF, sin embargo la gran diferencia es que la primera función puede evaluar más de una expresión, la segunda solamente puede evaluar una.

Formato sencillo
CASE expresionBooleana
WHEN valorExpresionBooleana1 THEN valorDevueltoParaResultadoVerdadero1
WHEN valorExpresionBooleana2 THEN valorDevueltoParaResultadoVerdadero2

WHEN valorExpresionBooleanaN THEN valorDevueltoParaResultadoVerdaderoN
ELSE valorDevueltoParaELSE
END
USE AdventureWorks2014;  
GO  
SELECT   ProductNumber, ProductLine,  Category =  
      CASE ProductLine  
         WHEN 'R' THEN 'Road'  
         WHEN 'M' THEN 'Mountain'  
         WHEN 'T' THEN 'Touring'  
         WHEN 'S' THEN 'Other sale items'  
         ELSE 'Not for sale'  
      END,  
   Name  
FROM Production.Product  
ORDER BY ProductNumber;  
GO
Formato complejo
CASE
WHEN expresionBooleana1 THEN valorDevueltoParaResultadoVerdadero1
WHEN expresionBooleana2 THEN valorDevueltoParaResultadoVerdadero2
WHEN expresionBooleanaN THEN valorDevueltoParaResultadoVerdaderoN
ELSE valorDevueltoParaELSE

END
USE AdventureWorks2014;  
GO  
SELECT   ProductNumber, Name, [Price Range] =   
      CASE   
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'  
         WHEN ListPrice < 50 THEN 'Under $50'  
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'  
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'  
         ELSE 'Over $1000'  
      END  
FROM Production.Product  
ORDER BY ProductNumber ;  
GO  


Un ejemplo sencillo para IIF es el siguiente:
DECLARE @a int = 45, @b int = 40;  
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result;  

Ahora bien, tratemos de aplicar la función IIF a los ejemplos utilizados para CASE
USE AdventureWorks2014;  
GO  
SELECT   ProductNumber, ProductLine,  Category =  
      CASE ProductLine  
         WHEN 'R' THEN 'Road'  
         WHEN 'M' THEN 'Mountain'  
         WHEN 'T' THEN 'Touring'  
         WHEN 'S' THEN 'Other sale items'  
         ELSE 'Not for sale'  
      END, 
   ResultadoIIF = 
   IIF( ProductLine = 'R' , 'Road' , 
  IIF( ProductLine = 'M' , 'Mountain' , 
   IIF( ProductLine = 'T' , 'Touring' ,
    IIF( ProductLine = 'S' , 'Other sale items' , 
     'Not for sale' ) ) ) )
   , Name  
FROM Production.Product  
ORDER BY ProductNumber;  
GO

USE AdventureWorks2014;  
GO  
SELECT   ProductNumber, Name, [Price Range] =   
      CASE   
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'  
         WHEN ListPrice < 50 THEN 'Under $50'  
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'  
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'  
         ELSE 'Over $1000'  
      END  
   , ResultadoIIF = 
   IIF( ListPrice = 0 , 'Mfg item - not for resale'  ,
  IIF( ListPrice < 50 , 'Under $50' ,
   IIF( ListPrice >= 50 and ListPrice < 250 , 'Under $250' , 
    IIF( ListPrice >= 250 and ListPrice < 1000 , 'Under $1000' ,
     'Over $1000'   ) ) ) ) 
FROM Production.Product  
ORDER BY ProductNumber ;  
GO 

CHOOSE
Esta función devuelve el valor contenido en una lista de valores dado una posición específica.

CHOOSE ( posición , valor1, valor2 , valor3[,  valorN ] ) 
SELECT CHOOSE ( 3, '1. UNO', '2. DOS', '3. TRES', '4. CUATRO' ) AS Resultado;  

USE AdventureWorks2014;  
GO  
SELECT ProductCategoryID, CHOOSE (ProductCategoryID, 'A','B','C','D','E') AS Expression1  
FROM Production.ProductCategory; 

USE AdventureWorks2014;  
GO  
SELECT JobTitle, HireDate
, CHOOSE(MONTH(HireDate),'Invierno','Invierno', 'Primavera','Primavera','Primavera','Verano','Verano', 'Verano','Otoño','Otoño','Otoño','Invierno') AS Estacion 
FROM HumanResources.Employee  

Espero que estos ejemplos les sirvan para comprender mejor el funcionamiento y además puedan aplicar dichas funciones si es que se requiere.

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario