Обсуждение: Concat error in PL/pgsql

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

Concat error in PL/pgsql

От
Hans Peter Wuermli
Дата:
I don't have a bug template at hand.

Within a plpgsql function, concatenating TEXT strings from tables that allow NULL values return nil results. Please run
thefollowing. The result of the second select is nil. 

Cheers, H.P.

-----------------------------------------------------------

create table tconcattest (id char(3),str text);

insert into tconcattest values('hpw',text('Something...'));
insert into tconcattest values('wuh',text('and more of something.'));

create function fconcattest () returns text as'
 declare
    r record;
    output text;
 begin
    output := text('''');
    for r in select * from tconcattest loop
          output := output || r.str;
    end loop;
    return output;
 end;
' language 'plpgsql';

select fconcattest();

insert into tconcattest values('abc',NULL);

select fconcattest();

update tconcattest set str='...again' where id='abc';

select fconcattest();

Re: Concat error in PL/pgsql

От
Tom Lane
Дата:
Hans Peter Wuermli <wurmli@freesurf.ch> writes:
> Within a plpgsql function, concatenating TEXT strings from tables that
> allow NULL values return nil results.

That's not a bug: NULL concatenated with anything produces NULL,
per SQL92 specification.

If you want a NULL to act like an empty string, try

    for r in select * from tconcattest loop
          output := output || coalesce(r.str, '''');

            regards, tom lane

RE: Concat error in PL/pgsql

От
"Andrew Snow"
Дата:
Simple add lines as shown:

>     for r in select * from tconcattest loop
        IF r.str IS NOT NULL THEN
>             output := output || r.str;
        END IF;
>     end loop;


- Andrew

RE: Concat error in PL/pgsql

От
"Andrew Snow"
Дата:
A few hours ago, I wrote:
>
> Simple add lines as shown:
>
> >     for r in select * from tconcattest loop
>         IF r.str IS NOT NULL THEN
> >             output := output || r.str;
>         END IF;
> >     end loop;
>


This would probably be better:

    for r in select * from tconcattest where str is not null loop
        output := output || r.str;
    end loop;