How to cast a char[] to varchar?

Started by Jon Laphamover 24 years ago5 messagesgeneral
Jump to latest
#1Jon Lapham
lapham@extracta.com.br

I have a column defined as "char(3)[]" which I would like to copy into a
different column defined as "varchar(255)".

I've tried to cast the char(3)[] field using "CAST( ... as varchar)" but
I get an error message, "Cannot cast type '_bpchar' to 'varchar'".

Any suggestions?

--

-**-*-*---*-*---*-*---*-----*-*-----*---*-*---*-----*-----*-*-----*---
Jon Lapham
Extracta Mol�culas Naturais, Rio de Janeiro, Brasil
email: lapham@extracta.com.br web: http://www.extracta.com.br/
***-*--*----*-------*------------*--------------------*---------------

#2Stephan Szabo
sszabo@megazone23.bigpanda.com
In reply to: Jon Lapham (#1)
Re: How to cast a char[] to varchar?

On Mon, 7 Jan 2002, Jon Lapham wrote:

I have a column defined as "char(3)[]" which I would like to copy into a
different column defined as "varchar(255)".

I've tried to cast the char(3)[] field using "CAST( ... as varchar)" but
I get an error message, "Cannot cast type '_bpchar' to 'varchar'".

Any suggestions?

What are you trying to get out? You've got a char(3) array, what do you
want the varchar to have in the end?

#3Jon Lapham
lapham@extracta.com.br
In reply to: Stephan Szabo (#2)
Re: How to cast a char[] to varchar?

Stephan Szabo wrote:

On Mon, 7 Jan 2002, Jon Lapham wrote:

I have a column defined as "char(3)[]" which I would like to copy into a
different column defined as "varchar(255)".

I've tried to cast the char(3)[] field using "CAST( ... as varchar)" but
I get an error message, "Cannot cast type '_bpchar' to 'varchar'".

Any suggestions?

What are you trying to get out? You've got a char(3) array, what do you
want the varchar to have in the end?

Assuming "category" is the char(3)[] column, and "cat2" is the desired
varchar(255) column, I would like the following:

main_v0_8=# select peopleid, category, cat2 from people where
peopleid=100010;
peopleid | category | cat2
----------+---------------+---------
100010 | {"col","dep"} | col dep
(1 row)

However, in the real database the char(3) array "category" may contain
anywhere from 0 to 10 items.

PS: It would be fine if the things in "cat2" contained the braces and
quotes, it does not need to be cleaned-up.

--

-**-*-*---*-*---*-*---*-----*-*-----*---*-*---*-----*-----*-*-----*---
Jon Lapham
Extracta Mol�culas Naturais, Rio de Janeiro, Brasil
email: lapham@extracta.com.br web: http://www.extracta.com.br/
***-*--*----*-------*------------*--------------------*---------------

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jon Lapham (#3)
Re: How to cast a char[] to varchar?

Jon Lapham <lapham@extracta.com.br> writes:

I have a column defined as "char(3)[]" which I would like to copy into a
different column defined as "varchar(255)".

PS: It would be fine if the things in "cat2" contained the braces and
quotes, it does not need to be cleaned-up.

You're going to need to do a little programming. plpgsql provides about
the simplest solution, as it will happily try to convert anything to
anything else (if it can out-convert the source value to text and then
in-convert to the destination type without error, it's happy). So:

regression=# create function to_varchar(char[]) returns varchar as '
regression'# begin
regression'# return $1;
regression'# end;' language 'plpgsql';
CREATE
regression=# create table foo (f1 char(3)[]);
CREATE
regression=# insert into foo values ('{"col","dep"}');
INSERT 299666 1
regression=# insert into foo values ('{"fee","fi", "fo","fum"}');
INSERT 299667 1
regression=# select f1, to_varchar(f1) from foo;
f1 | to_varchar
-----------------------+-----------------------
{col,dep} | {col,dep}
{fee,"fi ","fo ",fum} | {fee,"fi ","fo ",fum}
(2 rows)

If you wanted to be smarter --- like, say, getting rid of the braces and
so on --- you could code the conversion routine in pltcl or plperl,
either of which provide much better text-mashing capability than plpgsql
does. I seem to recall that pltcl supports Postgres arrays better than
either of the others do, so it might be the best bet for this
particular task.

regards, tom lane

#5Jon Lapham
lapham@extracta.com.br
In reply to: Stephan Szabo (#2)
Re: How to cast a char[] to varchar?

Tom Lane wrote:

regression=# create function to_varchar(char[]) returns varchar as '
regression'# begin
regression'# return $1;
regression'# end;' language 'plpgsql';

Thanks Tom, works great.

--

-**-*-*---*-*---*-*---*-----*-*-----*---*-*---*-----*-----*-*-----*---
Jon Lapham
Extracta Mol�culas Naturais, Rio de Janeiro, Brasil
email: lapham@extracta.com.br web: http://www.extracta.com.br/
***-*--*----*-------*------------*--------------------*---------------