lunes, 22 de octubre de 2012

Unión de Strings nulos en Postgresql

Algo en lo que no se suele caer al hacer la unión de 2 campos de tipo string en una select en Postgresql (y en casi todos los motores de base de datos) es que si uno de los 2 es nulo el resultado es nulo. Dicho así puede parecer obvio, pero cuando no se usa con frecuencia, uno suele "picar" en el razonamiento erróneo de un string más un nulo da como resultado el string.


Un ejemplo que clarifique la problemática es que si tenemos, en una base de datos Postgresql, una tabla que se llame clientes con los siguientes campos y valores:

|----------------------------------------|
| Id | Nombre | Apellidos |
|----------------------------------------|
|1      Pepe        Perez       |
|2      Lola         Lopez      |
|3      Juan         <null>    |
|----------------------------------------|


Cuando realicemos una select como esta:

          select Nombre || ',' || Apellidos as nombreCompleto from clientes order by Id;

El resultado será:

Pepe,Perez
Lola,Lopez
<null>

Para solucionar el problema y en general, una buena política de trabajo cuando nos toque componer strings de salida, es utilizar el CASE y el COALESCE con el fin de blindar las consultas.

Con el comando COALESCE nos encargaremos de evaluar si el campo es nulo y en el caso de que lo sea, darle un valor (en este caso vacío, que no nulo ) y el CASE nos servirá para operar cada uno de los campos a mostrar y componer el resultado final.

La consulta final sería de esta forma:

SELECT
case
        when coalesce (Nombre, '' ) = '' then ''
        else trim(Nombre)
        end ||
        case
            when coalesce(Apellidos , '') = '' then ''
            else ', ' || trim(Apellidos)
        end   nombreCompleto
FROM clientes
ORDER BY Id;

El resultado será:

Pepe,Perez
Lola,Lopez
Juan




No hay comentarios:

Publicar un comentario