Convert a PostgreSQL column from text to numeric
You can alter the type of a column from text to numeric using the following syntax:
ALTER TABLE table ALTER COLUMN column TYPE numeric
However this will fail if there are any non-integer values in the column. In PostgreSQL 8.3+ this syntax can be extended as follows:
ALTER TABLE table ALTER COLUMN column TYPE numeric USING function(column);
So we can write a function that checks whether a string is entirely numeric, and if not, convert it to null:Â
CREATE OR REPLACE FUNCTION pc_chartoint(chartoconvert character varying) RETURNS integer AS $BODY$ SELECT CASE WHEN trim($1) SIMILAR TO '[0-9]+' THEN CAST(trim($1) AS integer) ELSE NULL END; $BODY$ LANGUAGE 'sql' IMMUTABLE STRICT;
If we run the above code to create the function pc_chartoint(), then we can adapt our ALTER TABLE syntax as follows:
ALTER TABLE table ALTER COLUMN column TYPE integer USING pc_chartoint(column);