Обсуждение: reverse strpos?
Is there a function that’ll return the position of the last occurance of a char in a string?
For Example, in the string ‘abc/def/ghi’ I want the position of the 2nd ‘/’.
Thanks in Advance.
am  Mon, dem 12.11.2007, um 10:54:53 -0500 mailte Gauthier, Dave folgendes:
> Is there a function that?ll return the position of the last occurance of a char
> in a string?
>
>
>
> For Example, in the string ?abc/def/ghi? I want the position of the 2^nd ?/?.
write a function to revert the string and use strpos().
create or replace function rev(varchar) returns varchar as $$
declare
        _temp varchar;
        _count int;
begin
        _temp := '';
        for _count in reverse length($1)..1 loop
                _temp := _temp || substring($1 from _count for 1);
        end loop;
        return _temp;
end;
$$ language plpgsql immutable;
Andreas
--
Andreas Kretschmer
Kontakt:  Heynitz: 035242/47150,   D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID:   0x3FFF606C, privat 0x7F4584DA   http://wwwkeys.de.pgp.net
			
		On Mon, Nov 12, 2007 at 05:19:25PM +0100, A. Kretschmer wrote:
> am  Mon, dem 12.11.2007, um 10:54:53 -0500 mailte Gauthier, Dave folgendes:
> > Is there a function that?ll return the position of the last
> > occurance of a char in a string?
> >
> > For Example, in the string ?abc/def/ghi? I want the position of
> > the 2^nd ?/?.
>
> write a function to revert the string and use strpos().
>
> create or replace function rev(varchar) returns varchar as $$
> declare
>         _temp varchar;
>         _count int;
> begin
>         _temp := '';
>         for _count in reverse length($1)..1 loop
>                 _temp := _temp || substring($1 from _count for 1);
>         end loop;
>         return _temp;
> end;
> $$ language plpgsql immutable;
>
>
> Andreas
PL/Perl might be easier:
CREATE OR REPLACE FUNCTION rev(TEXT)
RETURNS TEXT
IMMUTABLE
LANGUAGE plperl
AS $$
return reverse($_[0]);
$$;
You could also write wrappers around perl functions if you're taking
that route.
If you want to guarantee the thing runs on any modern Postgres
instance--one where you don't control the environment at all--you
could do:
CREATE OR REPLACE FUNCTION rev(TEXT)
RETURNS TEXT
IMMUTABLE
LANGUAGE SQL
AS $$
SELECT array_to_string(
    ARRAY(
        SELECT substr($1,i,1)
        FROM generate_series(length($1),1,-1) AS i
    ),
    ''
);
$$;
Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778  AIM: dfetter666  Yahoo!: dfetter
Skype: davidfetter      XMPP: david.fetter@gmail.com
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
			
		Great suggestions (I have just GOT to get the IS people around here to
install plperl).
Leveraging what Andreas sent, I created my own strrpos....
create or replace function strrpos(varchar,varchar) returns int as $$
declare
 _count int;
begin
 for _count in reverse length($1)..1 loop
   if(substring($1 from _count for 1) = $2) then
     return _count;
   end if;
 end loop;
 return 0;
end;
$$ language plpgsql immutable;
-----Original Message-----
From: pgsql-general-owner@postgresql.org
[mailto:pgsql-general-owner@postgresql.org] On Behalf Of David Fetter
Sent: Monday, November 12, 2007 11:48 AM
To: A. Kretschmer
Cc: pgsql-general@postgresql.org
Subject: Re: [GENERAL] reverse strpos?
On Mon, Nov 12, 2007 at 05:19:25PM +0100, A. Kretschmer wrote:
> am  Mon, dem 12.11.2007, um 10:54:53 -0500 mailte Gauthier, Dave
folgendes:
> > Is there a function that?ll return the position of the last
> > occurance of a char in a string?
> >
> > For Example, in the string ?abc/def/ghi? I want the position of
> > the 2^nd ?/?.
>
> write a function to revert the string and use strpos().
>
> create or replace function rev(varchar) returns varchar as $$
> declare
>         _temp varchar;
>         _count int;
> begin
>         _temp := '';
>         for _count in reverse length($1)..1 loop
>                 _temp := _temp || substring($1 from _count for 1);
>         end loop;
>         return _temp;
> end;
> $$ language plpgsql immutable;
>
>
> Andreas
PL/Perl might be easier:
CREATE OR REPLACE FUNCTION rev(TEXT)
RETURNS TEXT
IMMUTABLE
LANGUAGE plperl
AS $$
return reverse($_[0]);
$$;
You could also write wrappers around perl functions if you're taking
that route.
If you want to guarantee the thing runs on any modern Postgres
instance--one where you don't control the environment at all--you
could do:
CREATE OR REPLACE FUNCTION rev(TEXT)
RETURNS TEXT
IMMUTABLE
LANGUAGE SQL
AS $$
SELECT array_to_string(
    ARRAY(
        SELECT substr($1,i,1)
        FROM generate_series(length($1),1,-1) AS i
    ),
    ''
);
$$;
Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778  AIM: dfetter666  Yahoo!: dfetter
Skype: davidfetter      XMPP: david.fetter@gmail.com
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?
               http://archives.postgresql.org/
			
		am Mon, dem 12.11.2007, um 8:48:29 -0800 mailte David Fetter folgendes: > > > Is there a function that?ll return the position of the last > > > occurance of a char in a string? > > > > > > > write a function to revert the string and use strpos(). > > > > create or replace function rev(varchar) returns varchar as $$ > > declare > > ... > > $$ language plpgsql immutable; > > > > > > Andreas > > PL/Perl might be easier: > > CREATE OR REPLACE FUNCTION rev(TEXT) > RETURNS TEXT > IMMUTABLE > LANGUAGE plperl > AS $$ > return reverse($_[0]); > $$; heh, the PERL-Guru ;-) > > CREATE OR REPLACE FUNCTION rev(TEXT) > RETURNS TEXT > IMMUTABLE > LANGUAGE SQL > AS $$ > SELECT array_to_string( > ARRAY( > SELECT substr($1,i,1) > FROM generate_series(length($1),1,-1) AS i > ), > '' > ); > $$; Nice. The generate_series()-function are really great. Andreas -- Andreas Kretschmer Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header) GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net
On 12/11/2007, Gauthier, Dave <dave.gauthier@intel.com> wrote: > > > > > Is there a function that'll return the position of the last occurance of a > char in a string? > > Hello simply install and use orafce http://www.pgsql.cz/index.php/Oracle_functionality_%28en%29 Regards Pavel Stehule > > For Example, in the string 'abc/def/ghi' I want the position of the 2nd '/'. > > > > Thanks in Advance. > > > > > > > > > >
On Mon, Nov 12, 2007 at 10:54:53AM -0500, Gauthier, Dave wrote:
> Is there a function that'll return the position of the last occurance of
> a char in a string?
> For Example, in the string 'abc/def/ghi' I want the position of the 2nd
> '/'.
# select length(substring('abc/def/ghi' from '^(.*/)'));
 length
--------
      8
(1 row)
depesz
--
quicksil1er: "postgres is excellent, but like any DB it requires a
highly paid DBA.  here's my CV!" :)
http://www.depesz.com/ - blog dla ciebie (i moje CV)