Oracle
 sql >> база данни >  >> RDS >> Oracle

Преобразуване на функция от Oracle към PostgreSQL

Функцията strpos(str, sub) в Postgres е еквивалент на instr(str, sub) в Oracle. За съжаление, функцията няма трети и четвърти параметър, така че изразът в Postgres трябва да е по-сложен.

Функцията substr(str, n) дава подниз от str започвайки от n позиция.

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

Като instr() е мощна функция, написах я в plpgsql за собствените си нужди.

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

Някои проверки (Примери от OLAP DML функции ):

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

Няма reverse() функция в Postgres 8.2. Можете да използвате това:

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. компилиране на невалидни процедури на оракул

  2. не успява да зареди ROracle:не може да зареди споделен обект ROracle.so:libclntsh.so.11.1 Няма такъв файл или директория

  3. Вмъкнете клеймо за време с JdbcTemplate в база данни на Oracle (ORA-01858)

  4. Oracle SQL - динамичен случай

  5. Oracle не премахва курсорите след затваряне на набора от резултати