sql >> Database >  >> RDS >> Oracle

Functie converteren van Oracle naar PostgreSQL

De functie strpos(str, sub) in Postgres is equivalent van instr(str, sub) bij Orakel. Helaas heeft de functie geen derde en vierde parameters, dus de uitdrukking in Postgres moet complexer zijn.

De functie substr(str, n) geeft een substring van str beginnend bij n positie.

instr(str, ch, instr(str, sub), 1);                               --oracle
strpos(substr(str, strpos(str, sub)), ch) + strpos(str, sub) - 1; --postgres

Als instr() is een krachtige functie. Ik heb het in plpgsql geschreven voor mijn eigen behoeften.

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 $$;

Enkele controles (voorbeelden van OLAP DML-functies ):

select instr('Corporate Floor', 'or', 3, 2);  -- gives 14
select instr('Corporate Floor', 'or', -3, 2); -- gives 2

Er is geen reverse() functie in Postgres 8.2. U kunt dit gebruiken:

-- 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 $$;


  1. Moet records en groepen tellen op datum op oracle db met behulp van sql-ontwikkelaar

  2. SQL herkent kolomalias niet in where-clausule

  3. C# Remote MySQL - Toegang geweigerd voor gebruiker

  4. ORACLE SQL krijgt verschil van twee waarden opgehaald uit 2 select-instructies