Обсуждение: concat strings but spaces

Поиск
Список
Период
Сортировка

concat strings but spaces

От
Matthias Teege
Дата:
Moin,

I try to concat values from three fields in a function like this:

create or replace function
 fconcat_name(varchar, varchar, varchar) returns varchar as '
    declare
    ttl alias for $1;
    vnm alias for $2;
    nme alias for $3;
    begin
     return ttl || '' '' || vnm || '' '' || nme;
    end;
' language plpgsql;

That works but if one of the fields is empty there are to much
spaces in the result. Is there any alternative to a monster
if-then construct?

Many thanks
Matthias


Re: concat strings but spaces

От
Joe Conway
Дата:
Matthias Teege wrote:
> I try to concat values from three fields in a function like this:
>
> create or replace function
>  fconcat_name(varchar, varchar, varchar) returns varchar as '
>     declare
>     ttl alias for $1;
>     vnm alias for $2;
>     nme alias for $3;
>     begin
>      return ttl || '' '' || vnm || '' '' || nme;
>     end;
> ' language plpgsql;
>
> That works but if one of the fields is empty there are to much
> spaces in the result. Is there any alternative to a monster
> if-then construct?

Maybe like this:

create or replace function
  fconcat_name(varchar, varchar, varchar) returns varchar as '
      select replace($1 || '' '' || $2 || '' '' || $3, ''  '', '' '')
' language sql;

regression=# select fconcat_name('John','','Doe');
  fconcat_name
--------------
  John Doe
(1 row)

HTH,

Joe

Re: concat strings but spaces

От
Ron St-Pierre
Дата:
Matthias Teege wrote:

>Moin,
>
>I try to concat values from three fields in a function like this:
>
>create or replace function
> fconcat_name(varchar, varchar, varchar) returns varchar as '
>    declare
>    ttl alias for $1;
>    vnm alias for $2;
>    nme alias for $3;
>    begin
>     return ttl || '' '' || vnm || '' '' || nme;
>    end;
>' language plpgsql;
>
>That works but if one of the fields is empty there are to much
>spaces in the result. Is there any alternative to a monster
>if-then construct?
>
>Many thanks
>Matthias
>
>
>
>---------------------------(end of broadcast)---------------------------
>TIP 7: don't forget to increase your free space map settings
>
>
>
>
There are a few ways to do this, one is by using the COALESCE function
which returns the first of its arguments that is not null.
eg
select coalesce('123' || ' ' || 456, null);
 coalesce
----------
 123 456
(1 row)

You could have a few COALESCE calls, or use a CASE expression, or use IF
statements.

Ron