Обсуждение: ...lame use of casting, looking for workaround...

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

...lame use of casting, looking for workaround...

От
Adam Haberlach
Дата:
    One of the rocket scientests working on this project has
created a system in which /either/ a description or a build
number is stored in a text field.  He has been writing reports
that use CAST AS('description', int4) to convert the field into
either 0 or a number.  It looks like 7.1beta4 doesn't like this
silly hack, since I get pg_atoi errors when the query hits
anything that doesn't consist entirely of a number (and rightly
so).

    I'm looking for a workaround that will let him do his
"conversion" transparently: some form of atoi that will return
0 if it finds no numbers instead of blowing up.  Anyone got
one?


--
Adam Haberlach            | All your base are belong to us.
adam@newsnipple.com       |
http://www.newsnipple.com |
'88 EX500    '00 >^<      |

Re: ...lame use of casting, looking for workaround...

От
Richard Huxton
Дата:
Adam Haberlach wrote:
>
>         One of the rocket scientests working on this project has
> created a system in which /either/ a description or a build
> number is stored in a text field.  He has been writing reports

Get that man a job on son of star-wars!

> that use CAST AS('description', int4) to convert the field into
> either 0 or a number.  It looks like 7.1beta4 doesn't like this
> silly hack, since I get pg_atoi errors when the query hits
> anything that doesn't consist entirely of a number (and rightly
> so).

Well, to_number does you no good since it seeks out the first thing that
can be used as a number in a piece of text.

So - either use pattern matching to select-out numbers before using
cast, or write yourself a function that checks whether the text starts
with digits before casting. You can write functions in C or plpgsql for this.

>
>         I'm looking for a workaround that will let him do his
> "conversion" transparently: some form of atoi that will return
> 0 if it finds no numbers instead of blowing up.  Anyone got
> one?

- Richard Huxton

Re: ...lame use of casting, looking for workaround...

От
Doug McNaught
Дата:
Richard Huxton <dev@archonet.com> writes:

> >         I'm looking for a workaround that will let him do his
> > "conversion" transparently: some form of atoi that will return
> > 0 if it finds no numbers instead of blowing up.  Anyone got
> > one?

The proper solution, of course, is to slap him silly and then make him
rewrite his code.  ;)

-Doug

Re: ...lame use of casting, looking for workaround...

От
Adam Haberlach
Дата:
On Sat, Feb 24, 2001 at 11:16:49AM +0000, Richard Huxton wrote:
> Adam Haberlach wrote:
> >
> >         One of the rocket scientests working on this project has
> > created a system in which /either/ a description or a build
> > number is stored in a text field.  He has been writing reports
>
> Get that man a job on son of star-wars!
>
> > that use CAST AS('description', int4) to convert the field into
> > either 0 or a number.  It looks like 7.1beta4 doesn't like this
> > silly hack, since I get pg_atoi errors when the query hits
> > anything that doesn't consist entirely of a number (and rightly
> > so).
>
> Well, to_number does you no good since it seeks out the first thing that
> can be used as a number in a piece of text.

    I couldn't figure out how to use to_number from the documentation (I'm
beginning to think I should join the "more docs now" chant).  Can someone
tell me how I would find the first number in a text field using to_number?

> So - either use pattern matching to select-out numbers before using
> cast, or write yourself a function that checks whether the text starts
> with digits before casting. You can write functions in C or plpgsql for this.

    I've got a regex that will do that, but that, as far as I know, only
checks for matches, and won't provide the numbers themselves so we can
put them in a BETWEEN clause.

    If all else fails, I'll write the C function.

--
Adam Haberlach            | All your base are belong to us.
adam@newsnipple.com       |
http://www.newsnipple.com |
'88 EX500    '00 >^<      |

Re: ...lame use of casting, looking for workaround...

От
"Richard Huxton"
Дата:
From: "Adam Haberlach" <adam@newsnipple.com>

> >
> > Well, to_number does you no good since it seeks out the first thing that
> > can be used as a number in a piece of text.
>
> I couldn't figure out how to use to_number from the documentation (I'm
> beginning to think I should join the "more docs now" chant).  Can someone
> tell me how I would find the first number in a text field using to_number?

It's covered in functions-formatting.htm, basically

richardh=> select to_number('XXX 123 apple','999D99');
 to_number
-----------
       123
(1 row)

Not sure it works the way I think it should, but I'd need to read the docs
more closely.

> > So - either use pattern matching to select-out numbers before using
> > cast, or write yourself a function that checks whether the text starts
> > with digits before casting. You can write functions in C or plpgsql for
this.
>
> I've got a regex that will do that, but that, as far as I know, only
> checks for matches, and won't provide the numbers themselves so we can
> put them in a BETWEEN clause.

Ah, but if the regex has proved this field only contains numbers, a simple
cast should do it, or am I missing something?

>
> If all else fails, I'll write the C function.
>
> --
> Adam Haberlach            | All your base are belong to us.
> adam@newsnipple.com       |
> http://www.newsnipple.com |
> '88 EX500    '00 >^<      |

- Richard Huxton