Re: Type coercion on column in a query - Mailing list pgsql-sql

From Randall Lucas
Subject Re: Type coercion on column in a query
Date
Msg-id 8D873114-8626-11D7-8D9A-000A957653D6@tercent.net
Whole thread Raw
In response to Re: Type coercion on column in a query  (Richard Huxton <dev@archonet.com>)
Responses Re: Type coercion on column in a query  (Richard Huxton <dev@archonet.com>)
List pgsql-sql
Along the same lines, is it possible to tell whether a column may be  
cast to a given type (e.g. numeric) without throwing an error?

Specifically, I have some values that will probably be numbers but  
might have some free text or other gobbledygook in there.  I want to  
take the sum of all the numeric values, and maybe the average as well.   
So what I envision is:

table dirty_data (     id                 int,     dirty_numbers         text
);

function safe_numeric_cast(text) returns numeric as '
beginif $1::numeric::text = $1 then         return $1::numeric;     else         return null;     end if;
end;
' language 'pseudopgsql';

select sum( safe_numeric_cast(dirty_numbers) ) from dirty_data where  
safe_numeric_cast(dirty_numbers) is not null;

However, the holdup seems to be that I can't even try to cast a dirty  
string to numeric lest I throw an "ERROR:  Bad numeric input format."   
Suggestions?

Best,

Randall


On Wednesday, May 14, 2003, at 11:28 AM, Richard Huxton wrote:

> On Thursday 08 May 2003 1:59 am, Kenny Mok wrote:
>> Dear all,
>>
>> I am just a novice in SQL and also in PostgreSQL. I have encountered  
>> some
>> difficulties in developing a website using PostgreSQL as my backend
>> database.
>>
>> My situation is, I have such a table "test" :
>>
>> testing=# SELECT * from test ;
>>  id  |  data1      | data2
>> ----+------------+--------
>>   1  | 2003-5-6 | 3 days
>>   2  | 1234       | 34
>> (2 rows)
>>
>> where columns data1 and data 2 are with data types varchar, where all  
>> my
>> data is stored into it.
>>
>> What I want to do is to extracts the data from this database and  
>> casting it
>> before shown in front of my client. So, I do the following queries :
>
> You can see what functions are available and what types they support  
> with \df
> from the psql command-line.
>
> => \df numer*
>                            List of functions
>  Result data type |   Schema   |       Name       | Argument data types
> ------------------+------------+------------------ 
> +---------------------
>  numeric          | pg_catalog | numeric          | bigint
>  numeric          | pg_catalog | numeric          | double precision
>  numeric          | pg_catalog | numeric          | integer
>  numeric          | pg_catalog | numeric          | numeric, integer
>  numeric          | pg_catalog | numeric          | real
>  numeric          | pg_catalog | numeric          | smallint
>  numeric          | pg_catalog | numeric          | text
> etc...
>
> So you want ...(data2::text)::numeric
>
> That's not to say I think it's a good idea to store all your values in  
> text
> fields - you're throwing away all the type checking PG can do for you.
> -- 
>   Richard Huxton
>
> ---------------------------(end of  
> broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faqs/FAQ.html
>



pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Questions for experts
Next
From: Richard Huxton
Date:
Subject: Re: Type coercion on column in a query