Обсуждение: Casting to varchar

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

Casting to varchar

От
Scott Ribe
Дата:
Just discovered (the hard way) that casting a boolean column ::varchar
doesn't work. I assume I can add a function somewhere that will define a
default cast for this? Are there any other standard types that can't be cast
to varchar?

--
Scott Ribe
scott_ribe@killerbytes.com
http://www.killerbytes.com/
(303) 722-0567 voice



Re: Casting to varchar

От
Raymond O'Donnell
Дата:
On 04/05/2007 21:34, Scott Ribe wrote:

> Just discovered (the hard way) that casting a boolean column ::varchar
> doesn't work. I assume I can add a function somewhere that will define a
> default cast for this? Are there any other standard types that can't be cast

I just use something like this:

create or replace function bool2str(TheValue boolean)
returns varchar as
$$
begin
   if TheValue then
     return 'true';
   else
     return 'false';
   end if;
end;
$$
language plpgsql stable;

Ray.

---------------------------------------------------------------
Raymond O'Donnell, Director of Music, Galway Cathedral, Ireland
rod@iol.ie
---------------------------------------------------------------

Re: Casting to varchar

От
Alvaro Herrera
Дата:
Scott Ribe wrote:
> Just discovered (the hard way) that casting a boolean column ::varchar
> doesn't work. I assume I can add a function somewhere that will define a
> default cast for this?

Sure, see CREATE CAST.

--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Re: Casting to varchar

От
Alvaro Herrera
Дата:
Raymond O'Donnell wrote:
> On 04/05/2007 21:34, Scott Ribe wrote:
>
> >Just discovered (the hard way) that casting a boolean column ::varchar
> >doesn't work. I assume I can add a function somewhere that will define a
> >default cast for this? Are there any other standard types that can't be
> >cast
>
> I just use something like this:
>
> create or replace function bool2str(TheValue boolean)
> returns varchar as
> $$
> begin
>   if TheValue then
>     return 'true';
>   else
>     return 'false';
>   end if;
> end;
> $$
> language plpgsql stable;

To complete the example,

alvherre=# create cast (boolean as varchar) with function bool2str(bool);
CREATE CAST

alvherre=# select 't'::boolean::varchar;
 varchar
---------
 true
(1 fila)

Though I'd mark the function immutable rather than stable.

alvherre=# select 'f'::boolean::varchar;
 varchar
---------
 false
(1 fila)

alvherre=# select '0'::boolean::varchar;
 varchar
---------
 false
(1 fila)

alvherre=# select '123'::boolean::varchar;
ERROR:  invalid input syntax for type boolean: "123"


--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Re: Casting to varchar

От
Scott Ribe
Дата:
> Sure, see CREATE CAST.

Too simple ;-) I was expecting to have to dig into data type definitions...

--
Scott Ribe
scott_ribe@killerbytes.com
http://www.killerbytes.com/
(303) 722-0567 voice



Re: Casting to varchar

От
Michael Glaesemann
Дата:
On May 4, 2007, at 15:34 , Scott Ribe wrote:

> Are there any other standard types that can't be cast
> to varchar?

You already got an answer to the first part of your question, but I
thought you might be interested in the second as well. Here's what I
did:

SELECT DISTINCT cast_from
FROM pg_cast c
NATURAL JOIN (
     SELECT oid as castsource, typname as cast_from
     FROM pg_type
     ) s
WHERE NOT EXISTS (
     SELECT 1
     FROM pg_cast i
     NATURAL JOIN (
         SELECT oid as casttarget, typname as cast_target
         FROM pg_type
         ) t
     WHERE cast_target = 'text'
         AND i.castsource = c.castsource
     )
ORDER BY cast_from;

   cast_from
--------------
abstime
bit
bool
box
circle
lseg
path
polygon
regclass
regoper
regoperator
regproc
regprocedure
regtype
reltime
text
varbit
(17 rows)

I don't know which of those you'd consider standard, but I believe
that's a complete list from HEAD of a few minutes ago.

Michael Glaesemann
grzm seespotcode net



Re: Casting to varchar

От
Tom Lane
Дата:
Michael Glaesemann <grzm@seespotcode.net> writes:
> On May 4, 2007, at 15:34 , Scott Ribe wrote:
>> Are there any other standard types that can't be cast
>> to varchar?

> You already got an answer to the first part of your question, but I
> thought you might be interested in the second as well.

Note that there's a proposal to allow explicit casts to text from any
type (by invoking the appropriate I/O function behind the scenes) and
I imagine we'd allow casts to varchar as well.  Not sure if this will
happen for 8.3, although it still could.

            regards, tom lane

Re: Casting to varchar

От
Scott Ribe
Дата:
> You already got an answer to the first part of your question, but I
> thought you might be interested in the second as well. Here's what I
> did:

Thanks. That's very helpful, to see a good example of using the built-in
catalog data.

--
Scott Ribe
scott_ribe@killerbytes.com
http://www.killerbytes.com/
(303) 722-0567 voice