Alvaro,

Tienes razón esto genera blancos innecesarios, hice la prueba en los case
pero resultó un poco mas complejo, ya que en el sistema que que manejo la
lista de personas tiene los atributos nombre, apellido materno y apellido
materno separados entonces realizar todas las combinaciones en un case es
mas complicado. Ahora hice una ajuste a lo que tengo agregando la función
btrim a cada atributo y a toda la cadena final  para tratar de eliminar los
blancos y me fue bien, lo comparto a continuación:

select btrim((btrim(coalesce(nombre,' '))||' '||btrim(coalesce(apellido1,'
'))||' '||btrim(coalesce(apellido2,' '))))  from personas

saludos

eduardo


El 13 de febrero de 2013 10:55, Alvaro
Herrera<alvhe...@2ndquadrant.com>escribió:

> Eduardo Arenas C. escribió:
> > José
> >
> > Quería agregar que tengas cuidado si alguno de los atributos nombre o
> > apellido tienes valor nulo ya que al concatenar, la expresión completa
> va a
> > salir nula. Es decir si por ejemplo tienes
> >
> > codigo |   nombre  |   apellido
> > ---------------------------------------------------
> > 1         | eduardo   |   null
> >
> > al concatenar nombre y apellido el resultado va a ser nulo.
> >
> > Para evitar esto yo utilizo la función coalesce
> >
> > select codigo, (coalesce(nombre,' ')||' '||coalesce(apellido,' ')
> > )::varchar(40) as personas
> >  from persona
>
> Es buena acotación, pero la implementación tiene el problema de que
> quedan espacios extra cuando los campos son nulos.  Si ambos campos son
> nulos, terminas con tres espacios en blanco!  Yo consideraría usar CASE
> para evitar ese problema:
>
> select case when nombre is null then apellido
>             when apellido is null then nombre
>             else nombre || ' ' || apellido
>
> (Si usas '' en vez de ' ' en coalesce quedaría un solo espacio extra).
>
> --
> Álvaro Herrera                http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Training & Services
>



-- 
                    Eduardo Arenas Castillo.
          Jefe Unidad de Gestión de Información
      Ancora UC - Red de Centros de Salud Familiar
        of. + 56 2 587 93 03 - cel. +56 9 6629 1618

Responder a