Fungsi strpos(str, sub)
di Postgres setara dengan instr(str, sub)
di Oracle. Sayangnya, fungsi tersebut tidak memiliki parameter ketiga dan keempat, sehingga ekspresi di Postgres harus lebih kompleks.
Fungsi substr(str, n)
memberikan substring dari str
mulai dari n
posisi.
instr(str, ch, instr(str, sub), 1); --oracle
strpos(substr(str, strpos(str, sub)), ch) + strpos(str, sub) - 1; --postgres
Sebagai instr()
adalah fungsi yang kuat yang saya tulis di plpgsql untuk kebutuhan saya sendiri.
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 $$;
Beberapa pemeriksaan (Contoh dari Fungsi DML OLAP ):
select instr('Corporate Floor', 'or', 3, 2); -- gives 14
select instr('Corporate Floor', 'or', -3, 2); -- gives 2
Tidak ada reverse()
fungsi di Postgres 8.2. Anda dapat menggunakan ini:
-- 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 $$;