Thread: CAST from VARCHAR to INT
(Postgres 7.2.1) I screwed up when I was designing a table a while back and made a column a VARCHAR that referenced (and should have been) an INT. Now I'm trying to correct my mistake, I've created a new table and I'm trying to INSERT INTO...SELECT the data into it, but it's complaining that it can't stick a VARCHAR into an INT. All the values in the column are valid integers (the foreign key sees to that) but even a CAST won't do it. How can I force it to copy/change the values? ======================================== Luke Pascoe Senior Developer / Systems administrator KMG (NZ) Limited. http://www.kmg.co.nz Mobile: (021) 303019 Email: luke.p@kmg.co.nz ========================================
> (Postgres 7.2.1) > > I screwed up when I was designing a table a while back and made a column a > VARCHAR that referenced (and should have been) an INT. > > Now I'm trying to correct my mistake, I've created a new table and I'm > trying to INSERT INTO...SELECT the data into it, but it's complaining that > it can't stick a VARCHAR into an INT. All the values in the column are valid > integers (the foreign key sees to that) but even a CAST won't do it. > > How can I force it to copy/change the values? > varchar cannot be casted to integer directly. Rather we can do it this way: => select your_varchar_field::text::int from your_table; regards, bhuvaneswaran
"Luke Pascoe" <luke.p@kmg.co.nz> writes: > Now I'm trying to correct my mistake, I've created a new table and I'm > trying to INSERT INTO...SELECT the data into it, but it's complaining that > it can't stick a VARCHAR into an INT. All the values in the column are valid > integers (the foreign key sees to that) but even a CAST won't do it. I think you need to cast via TEXT. regression=> select 'z'::varchar::int; ERROR: Cannot cast type character varying to integer regression=> select 'z'::varchar::text::int; ERROR: pg_atoi: error in "z": can't parse "z" regression=> select '42'::varchar::text::int;int4 ------ 42 (1 row) regards, tom lane
Hello! Like others said you can't cast varchar to int directly. Make your life easier! :) You must write a function like this: create function "int4"(character varying) returns int4 as ' DECLARE input alias for $1; BEGIN return (input::text::int4); END; ' language 'plpgsql'; When you try the cast varchar_field::integer or varchar_field::int4 Postgres call the function named int4 and takes varchar type parameter. DAQ
daq <daq@ugyvitelszolgaltato.hu> writes: > Make your life easier! :) You must write a function like > this: > create function "int4"(character varying) returns int4 as ' > DECLARE > input alias for $1; > BEGIN > return (input::text::int4); > END; > ' language 'plpgsql'; > When you try the cast varchar_field::integer or varchar_field::int4 Postgres call > the function named int4 and takes varchar type parameter. Note that as of 7.3 you need to issue a CREATE CAST command; the name of the function is not what drives this anymore. (Though following the old naming convention that function name == return type still seems like a good idea.) regards, tom lane
On Fri, Jan 24, 2003 at 10:42:29AM -0500, Tom Lane wrote: > daq <daq@ugyvitelszolgaltato.hu> writes: > > Make your life easier! :) You must write a function like > > this: > > > create function "int4"(character varying) returns int4 as ' > > DECLARE > > input alias for $1; > > BEGIN > > return (input::text::int4); > > END; > > ' language 'plpgsql'; > > > When you try the cast varchar_field::integer or varchar_field::int4 Postgres call > > the function named int4 and takes varchar type parameter. > > Note that as of 7.3 you need to issue a CREATE CAST command; the name of > the function is not what drives this anymore. (Though following the old > naming convention that function name == return type still seems like a > good idea.) Wow, I didn't even know of either of these features. Sounds useful. -Roberto -- +----| Roberto Mello - http://www.brasileiro.net/ |------+ + Computer Science Graduate Student, Utah State University + + USU Free Software & GNU/Linux Club - http://fslc.usu.edu/ + Friends encourage friends to use Win(e)dows - under Linux!
Sweet, worked the charm, thanks! P.S. Anyone know why it takes several hours[1] for my posts to come through the list? [1] Posted a message at ~9am friday, it got back to me ~4pm! ----- Original Message ----- From: "Bhuvan A" <bhuvansql@myrealbox.com> To: "Luke Pascoe" <luke.p@kmg.co.nz> Cc: <pgsql-sql@postgresql.org> Sent: Friday, January 24, 2003 6:58 PM Subject: Re: [SQL] CAST from VARCHAR to INT > > > (Postgres 7.2.1) > > > > I screwed up when I was designing a table a while back and made a column a > > VARCHAR that referenced (and should have been) an INT. > > > > Now I'm trying to correct my mistake, I've created a new table and I'm > > trying to INSERT INTO...SELECT the data into it, but it's complaining that > > it can't stick a VARCHAR into an INT. All the values in the column are valid > > integers (the foreign key sees to that) but even a CAST won't do it. > > > > How can I force it to copy/change the values? > > > > varchar cannot be casted to integer directly. Rather we can do it this > way: > > => select your_varchar_field::text::int from your_table; > > regards, > bhuvaneswaran > > > >