Die Funktion strpos(str, sub)
in Postgres entspricht instr(str, sub)
im Orakel. Leider hat die Funktion keinen dritten und vierten Parameter, daher muss der Ausdruck in Postgres komplexer sein.
Die Funktion substr(str, n)
ergibt einen Teilstring von str
beginnend mit n
Position.
instr(str, ch, instr(str, sub), 1); --oracle
strpos(substr(str, strpos(str, sub)), ch) + strpos(str, sub) - 1; --postgres
Als instr()
ist eine mächtige Funktion, die ich für meine eigenen Bedürfnisse in plpgsql geschrieben habe.
create or replace function instr(str text, sub text, startpos int = 1, occurrence int = 1)
returns int language plpgsql immutable
as $$
declare
tail text;
shift int;
pos int;
i int;
begin
shift:= 0;
if startpos = 0 or occurrence <= 0 then
return 0;
end if;
if startpos < 0 then
str:= reverse(str);
sub:= reverse(sub);
pos:= -startpos;
else
pos:= startpos;
end if;
for i in 1..occurrence loop
shift:= shift+ pos;
tail:= substr(str, shift);
pos:= strpos(tail, sub);
if pos = 0 then
return 0;
end if;
end loop;
if startpos > 0 then
return pos+ shift- 1;
else
return length(str)- length(sub)- pos- shift+ 3;
end if;
end $$;
Einige Prüfungen (Beispiele aus OLAP-DML-Funktionen ):
select instr('Corporate Floor', 'or', 3, 2); -- gives 14
select instr('Corporate Floor', 'or', -3, 2); -- gives 2
Es gibt kein reverse()
Funktion in Postgres 8.2. Sie können dies verwenden:
-- only for Postgres 8.4 or earlier!
create or replace function reverse(str text)
returns text language plpgsql immutable
as $$
declare
i int;
res text = '';
begin
for i in 1..length(str) loop
res:= substr(str, i, 1) || res;
end loop;
return res;
end $$;