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 resultado2CONCAT
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