2016/02/15

CONCATENANDO, LIDIANDO CON NULLs

PROBLEMA
En nuestra BDs tenemos almacenados valores NULL, en ocasiones tendremos la necesidad de concatenarlas pero que sucede si concatenamos dichos valores, el resultado será NULL ! ! Como puedo manejar esto?

SOLUCION

Existen algunas opciones de solución que podemos utilizar para salir de esta situación, veamos algunas:

COALESCE

De una lista de parametros ingresados, devuelve el primer resultado que no sea NULL.
-- USANDO COALESCE 

SELECT  
COALESCE( 'String1' , NULL, NULL, NULL ) AS resultado1 
, COALESCE( 'String1' , 'String2' , NULL, NULL ) AS resultado2 
, COALESCE( 'String1' , 'String2' , 'String3' , NULL ) AS resultado3 
, COALESCE( 'String1' , 'String2' , 'String3' , 'String4') AS resultado4; 

SELECT  
COALESCE( 'String1' , NULL, NULL, NULL ) AS resultado1 
, COALESCE( NULL , 'String2' , NULL, NULL ) AS resultado2 
, COALESCE( NULL , NULL , 'String3' , NULL ) AS resultado3 
, COALESCE( NULL , NULL , NULL , 'String4') AS resultado4; 

SELECT  
COALESCE( 'String1' , NULL, NULL, NULL ) AS resultado1 
, COALESCE( 'String1' , 'String2' , NULL, NULL ) AS resultado2 
, COALESCE( 'String1' , NULL , 'String3' , NULL ) AS resultado3 
, COALESCE( NULL , NULL , 'String3' , 'String4') AS resultado4

Ahora para concatenar usando COALESCE veamos el siguiente ejemplo:
-- COALESCE COMPLEJO 

DECLARE @varPrimerValorA VARCHAR(50) = ',String1' + NULL +',String3' 
DECLARE @varPrimerValorB VARCHAR(50) = ',String1' + ',String2' +',String3' 
DECLARE @varSegundoValor VARCHAR(50) = ',ContenidoSegundoValor' 

SELECT  
@varPrimerValorA AS varPrimerValorA 
, @varPrimerValorB AS varPrimerValorB 
, @varSegundoValor AS varSegundoValor 

SELECT 
'Inicio' + COALESCE( @varPrimerValorA , @varSegundoValor ) + ',Fin' AS resultado1 
,  'Inicio' + COALESCE( @varPrimerValorB , @varSegundoValor ) + ',Fin' AS resultado2 

CONCAT

Otra opción que podemos utilizar es la función CONCAT; su principal diferencia es que reemplaza NULL por un espacio vacio.
-- USANDO CONCAT  

SELECT   
CONCAT( 'String1' , NULL, NULL, NULL ) AS resultado1  
, CONCAT( 'String1' , 'String2' , NULL, NULL ) AS resultado2  
, CONCAT( 'String1' , 'String2' , 'String3' , NULL ) AS resultado3  
, CONCAT( 'String1' , 'String2' , 'String3' , 'String4') AS resultado4 ;  
 
SELECT   
CONCAT( 'String1' , NULL, NULL, NULL ) AS resultado1  
, CONCAT( NULL , 'String2' , NULL, NULL ) AS resultado2  
, CONCAT( NULL , NULL , 'String3' , NULL ) AS resultado3  
, CONCAT( NULL , NULL , NULL , 'String4') AS resultado4  ; 
 
SELECT   
CONCAT( 'String1' , NULL, NULL, NULL ) AS resultado1  
, CONCAT( 'String1' , 'String2' , NULL, NULL ) AS resultado2  
, CONCAT( 'String1' , NULL , 'String3' , NULL ) AS resultado3  
, CONCAT( NULL , NULL , 'String3' , 'String4') AS resultado4 ;  


-- CONCAT COMPLEJO  

DECLARE @varPrimerValorA VARCHAR(50) = ',String1' + NULL +',String3'  
DECLARE @varPrimerValorB VARCHAR(50) = ',String1' + ',String2' +',String3'  
DECLARE @varSegundoValor VARCHAR(50) = ',ContenidoSegundoValor' 
 
SELECT   
@varPrimerValorA AS varPrimerValorA  
, @varPrimerValorB AS varPrimerValorB  
, @varSegundoValor AS varSegundoValor  ; 
 
SELECT  
'Inicio' + CONCAT( @varPrimerValorA , @varSegundoValor ) + ',Fin' AS resultado1  
,  'Inicio' + CONCAT( @varPrimerValorB , @varSegundoValor ) + ',Fin' AS resultado2 ; 

ISNULL
Dicha función solo acepta dos parametros, el primero es el valor que queremos evaluar para saber si es NULL y el segundo es el valor que reemplazara en caso de que el primero evalue a TRUE.
-- USANDO ISNULL   

DECLARE @varContenidoPrimerValor VARCHAR(50) = 'ContenidoPrimerValor' 
DECLARE @varContenidoSegundoValor VARCHAR(50) = 'ContenidoSegundoValor' 
DECLARE @varNULL VARCHAR(50) = NULL 

SELECT    
ISNULL( @varContenidoPrimerValor , @varContenidoSegundoValor ) AS resultado1   
, ISNULL( @varNULL , @varContenidoSegundoValor ) AS resultado2   
, ISNULL( @varContenidoPrimerValor , @varNULL ) AS resultado3 
, ISNULL( @varNULL , @varNULL ) AS resultado4


-- ISNULL COMPLEJO   

DECLARE @varPrimerValorA VARCHAR(50) = ',String1' + NULL +',String3'   
DECLARE @varPrimerValorB VARCHAR(50) = ',String1' + ',String2' +',String3'   
DECLARE @varSegundoValor VARCHAR(50) = ',ContenidoSegundoValor'   

SELECT    
@varPrimerValorA AS varPrimerValorA   
, @varPrimerValorB AS varPrimerValorB   
, @varSegundoValor AS varSegundoValor ; 

SELECT   
'Inicio' + ISNULL( @varPrimerValorA , @varSegundoValor ) + ',Fin' AS resultado1   
,  'Inicio' + ISNULL( @varPrimerValorB , @varSegundoValor ) + ',Fin' AS resultado2 ; 
CONCAT_NULL_YIELDS_NULL

Permite reemplazar NULL por espacio vacío sin necesidad de alguna función, solo que no es recomedable hacerlo ya que por DEFAULT, SQL SERVER activa está opción precisamente para conocer los resultados donde genere NULL.
-- USANDO CONCAT_NULL_YIELDS_NULL  

-- REEMPLAZANDO NULL POR VACIO 

SET CONCAT_NULL_YIELDS_NULL OFF 
DECLARE @varContenidoPrimerValor VARCHAR(50) = 'ContenidoPrimerValor'  
DECLARE @varContenidoSegundoValor VARCHAR(50) = 'ContenidoSegundoValor'  
DECLARE @varNULL VARCHAR(50) = NULL  

SELECT     
@varContenidoPrimerValor + @varContenidoSegundoValor  AS resultado1    
, @varNULL + @varContenidoSegundoValor AS resultado2    
, @varContenidoPrimerValor + @varNULL AS resultado3  
, @varNULL + @varNULL AS resultado4  
, @varNULL + @varNULL + '' AS resultado5  
GO 
 
-- PERMITIENDO NULL 

SET CONCAT_NULL_YIELDS_NULL ON 
DECLARE @varContenidoPrimerValor VARCHAR(50) = 'ContenidoPrimerValor'  
DECLARE @varContenidoSegundoValor VARCHAR(50) = 'ContenidoSegundoValor'  
DECLARE @varNULL VARCHAR(50) = NULL

SELECT     
@varContenidoPrimerValor + @varContenidoSegundoValor  AS resultado1    
, @varNULL + @varContenidoSegundoValor AS resultado2    
, @varContenidoPrimerValor + @varNULL AS resultado3  
, @varNULL + @varNULL AS resultado4  
, @varNULL + @varNULL + '' AS resultado5  

-- USANDO CONCAT_NULL_YIELDS_NULL  
-- CONCAT_NULL_YIELDS_NULL COMPLEJO 

-- REEMPLAZANDO NULL POR VACIO 

SET CONCAT_NULL_YIELDS_NULL OFF 
DECLARE @varPrimerValorA VARCHAR(50) = ',String1' + NULL +',String3'    
DECLARE @varPrimerValorB VARCHAR(50) = ',String1' + ',String2' +',String3'    
DECLARE @varSegundoValor VARCHAR(50) = ',ContenidoSegundoValor'    

SELECT     
@varPrimerValorA AS varPrimerValorA    
, @varPrimerValorB AS varPrimerValorB    
, @varSegundoValor AS varSegundoValor    

SELECT    
'Inicio' +  @varPrimerValorA + @varSegundoValor + ',Fin' AS resultado1    
,  'Inicio' + @varPrimerValorB + @varSegundoValor + ',Fin' AS resultado2 
GO 
 
-- PERMITIENDO NULL 

SET CONCAT_NULL_YIELDS_NULL ON 
DECLARE @varPrimerValorA VARCHAR(50) = ',String1' + NULL +',String3'    
DECLARE @varPrimerValorB VARCHAR(50) = ',String1' + ',String2' +',String3'    
DECLARE @varSegundoValor VARCHAR(50) = ',ContenidoSegundoValor'  
  
SELECT     
@varPrimerValorA AS varPrimerValorA    
, @varPrimerValorB AS varPrimerValorB    
, @varSegundoValor AS varSegundoValor
   
SELECT    
'Inicio' +  @varPrimerValorA + @varSegundoValor + ',Fin' AS resultado1    
,  'Inicio' + @varPrimerValorB + @varSegundoValor + ',Fin' AS resultado2 
GO 

Ahora si gustan probar, desactiven la opción CONCAT_NULL_YIELDS_NULL para las funciones ISNULL, CONCAT, COALESCE y vean el resultado. 

SALUDOS!
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario